2011-10-05 9 views
7

Nel mio iPhone app ho avuto diversi posti dove posso fare una chiamataCome verificare se c'è un performSelector: in attesa di essere eseguito?

[object performSelector: withObject: afterDelay:]

. Tutti portano allo stesso metodo. Ora, con quel metodo, voglio eseguire del codice solo con l'ultima chiamata. Se fosse il primo, potrei semplicemente fare [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(thisMethod) object:nil] e assicurarmi che venga chiamato una volta.

Ma, c'è un modo per dire se ci sono altre chiamate di metodo in attesa di essere eseguite?

Potrei usare un contatore in questa classe che vorrei incrementare ogni volta che imposto questa operazione dopo il ritardo, quindi decrementarlo all'inizio di ogni chiamata e solo eseguire il codice se questo contatore è azzerato. Ma mi chiedo se sia l'approccio migliore/accettabile ...

risposta

6

Bene, quello che potresti fare è questo: ogni volta che chiami lo [object performSelector: withObject: afterDelay:] aggiungi la linea che hai menzionato sopra. Potresti effettivamente creare un metodo che gestisca quello per te. Per esempio:

- (void)performSelectorOnce:(SEL)selector withObject:(id)object afterDelay:(NSTimeInterval)delay 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:object selector:selector object:object]; 
    [self performSelector:selector withObject:object afterDelay:delay]; 
} 

e quello in cui mai si utilizza [object performSelector: withObject: afterDelay:] basta sostituirlo con [performSelectorOnce auto: withObject: afterDelay:];

Se si desidera utilizzare questo in più oggetti di quanto si possa effettivamente creare una categoria NSObject e aggiungere il metodo lì.

Fatemi sapere se questo funziona per voi.

+0

Cosa succede se si desidera ignorare le chiamate successive senza modificare la prima programmata? Ad esempio le chiamate per aggiornare una vista tabella. – Rivera