2009-09-16 5 views

Répondre

31

Il existe un certain nombre d'options.

Le plus rapide à utiliser est en NSObject:

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

(Il y a quelques autres avec de légères variations.)

Si vous voulez plus de contrôle ou de pouvoir dire envoyer ce message tous les trente secondes vous avez probablement besoin NSTimer.

+0

Savez-vous si cela exploite 'dispatch_after' à tout moment? – Jacksonkr

+1

Ma supposition est probablement non (GCD est de niveau C et ne "sait" pas sur les sélecteurs, aussi cette API est antérieure à GCD) mais il est possible qu'elle l'utilise sous le capot. –

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

Documentation

Vous pouvez également regarder les autres NSTimer méthodes

11

Jetez un oeil à la classe NSTimer:

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

Ailleurs vous avez la méthode actuelle que gère l'événement:

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

La classe performSelector: a ses limites. Voici le plus proche équivalent setTimeout:

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 couple de projets qui fournissent du sucre syntaxique et la possibilité d'annuler l'exécution (clearTimeout):

+0

pouvez-vous réinitialiser le retard/timer si quelque chose se produit avant que le délai expire et le faire recommencer? – topwik

+1

@tote voir l'édition – Blago

+1

Cela a été très utile, merci! – ebi