2009-09-16 15 views

risposta

31

Ci sono un certo numero di opzioni.

Il più veloce da utilizzare è in NSObject:

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay 

(Ci sono pochi altri con lievi variazioni.)

Se si desidera un maggiore controllo o per essere in grado di dire inviare questo messaggio ogni trenta secondi è probabilmente necessario NSTimer.

+0

Sapete se questo fa leva su "dispatch_after' in qualsiasi momento? – Jacksonkr

+1

Probabilmente la mia ipotesi non è (GCD è di livello C e non "conosce" i selettori, anche questa API è precedente a GCD) ma è possibile che lo usi sotto il cofano. –

3
+[NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:] 

Documentation

Si consiglia inoltre di guardare le altre NSTimer metodi

11

Date un'occhiata alla classe NSTimer:

NSTimer *timer; 
... 
timer = [[NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(thisMethodGetsFiredOnceEveryThirtySeconds:) userInfo:nil repeats:YES] retain]; 
[timer fire]; 

Da qualche altra parte si ha il metodo effettivo che gestisce l'evento:

- (void) thisMethodGetsFiredOnceEveryThirtySeconds:(id)sender { 
    NSLog(@"fired!"); 
} 
42

the performSelector: la famiglia ha i suoi limiti. Ecco l'setTimeout equivalente più:

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 0.5); 
dispatch_after(delay, dispatch_get_main_queue(), ^(void){ 
    // do work in the UI thread here 
}); 

EDIT: Un paio di progetti che forniscono zucchero sintattico e la capacità di annullare l'esecuzione (clearTimeout):

+0

è possibile ripristinare il ritardo/timer se qualcosa accade prima che il tempo di ritardo scada e farlo ripartire? – topwik

+1

@tote vedi la modifica – Blago

+1

Questo è stato molto utile, grazie! – ebi