2012-02-22 1 views
6

sto usando il seguente metodo in una sottoclasse UIView:performSelector non afterdelay lavoro

[self performSelector:@selector(timeout) withObject:nil afterDelay:20]; 

Il metodo viene chiamato dopo 20 secondi come previsto. In un altro metodo cerco di annullare la richiesta di eseguire utilizzando il seguente codice:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; 

Ho anche provato

[NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; 

entrambi i messaggi non portano il risultato atteso di un metodo il timeout è ancora chiamato. qualcuno può spiegarmi che cosa sto facendo male e come farlo nel modo giusto?

applausi da Austria martin

+0

funziona correttamente, ho appena provato il codice –

risposta

3

Due punti
1. Sono entrambi self stesso oggetto ??
2. Lo [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; è eseguito sullo stesso thread su cui è stato chiamato [self performSelector:@selector(timeout) withObject:nil afterDelay:20];?

Controllare questi due problemi.

1

È possibile farlo con 2 modi:

  1. si potrebbe usare questo che eliminerebbe tutti in coda

    [NSObject cancelPreviousPerformRequestsWithTarget: self];

  2. è possibile rimuovere singolarmente

    [NSObject cancelPreviousPerformRequestsWithTarget: auto selettore: @selector (timeout) oggetto: nil];

3

Utilizzare un NSTimer memorizzato come variabile di istanza nella classe. Quando si desidera annullare l'esecuzione, invalidare e distruggere il timer.

Nel vostro @interface:

@property (readwrite, retain) NSTimer *myTimer; 

Nel vostro @implementation:

self.myTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(timeout) userInfo:nil repeats:NO]; 

Poi, se qualche condizione si verifica e il metodo di timeout non deve più essere chiamato:

[self.myTimer invalidate]; 
self.myTimer = nil; // this releases the retained property implicitly 
1

Prova questo:

[self performSelectorOnMainThread:@selector(timeout) withObject:self waitUntilDone:NO];