2009-09-16 6 views

Antwort

31

Es gibt eine Reihe von Optionen.

Die schnellste ist die Verwendung in NSObject:

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

(Es gibt ein paar andere mit leichten Variationen sind.)

Wenn Sie mehr Kontrolle wünschen oder in der Lage sein, alle dreißig Diese Nachricht zu sagen, senden Sekunden brauchen Sie wahrscheinlich NSTimer.

+0

Wissen Sie, ob dies "dispatch_after" zu irgendeinem Zeitpunkt nutzt? – Jacksonkr

+1

Meine Vermutung ist wahrscheinlich nicht (GCD ist C-Level und "weiß" nicht über Selektoren; auch diese API ist älter als GCD), aber es ist möglich, dass sie es unter der Haube verwendet. –

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

Documentation

Sie können sich auch an den anderen NSTimer Methoden suchen wollen

11

einen Blick auf die Klasse NSTimer Nehmen:

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

Irgendwo anders haben Sie die tatsächliche Methode, die behandelt das Ereignis:

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

Die performSelector: Familie hat ihre Grenzen. Hier ist die nächste SetTimeout äquivalent:

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: Ein paar Projekte, die syntaktischen Zucker liefern und die Fähigkeit, die Ausführung (clear) abzubrechen:

+0

können Sie die Verzögerung/den Timer zurücksetzen, wenn etwas passiert, bevor die Verzögerungszeit abläuft, und von neuem beginnen? – topwik

+1

@tote siehe bearbeiten – Blago

+1

Das war sehr hilfreich, danke! – ebi