2009-09-16 18 views

Respuesta

31

Hay una serie de opciones.

El más rápido de usar está en NSObject:

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

(Hay algunos otros con ligeras variaciones.)

Si desea más control o para poder decir enviar este mensaje cada treinta segundos es probable que necesite NSTimer.

+0

¿Sabes si esto aprovecha 'dispatch_after' en cualquier punto? – Jacksonkr

+1

Supongo que probablemente no (GCD es nivel C y no "sabe" acerca de los selectores, también esta API es anterior a GCD), pero es posible que la use debajo del capó. –

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

Documentation

También es posible que desee mirar a los otros NSTimer métodos

11

Tome un vistazo a la clase NSTimer:

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

En algún otro lugar que tiene el método real que maneja el evento:

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

El performSelector: family tiene sus limitaciones. Aquí es el equivalente más cercano 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 par de proyectos que proporcionan azúcar sintáctico y la posibilidad de cancelar la ejecución (clearTimeout):

+0

¿puedes restablecer el retraso/temporizador si algo sucede antes de que expire el tiempo de demora y que comience de nuevo? – topwik

+1

@tote ver la edición – Blago

+1

Esto fue muy útil, ¡gracias! – ebi