2011-05-20 25 views
9

Estoy realmente frustrado ahora, busqué en Google todo el Internet, tropecé con SO y todavía no encontré una solución.NSTimer no llama al método

Estoy tratando de implementar un NSTimer, pero no se llama al método que he definido. (los segundos están configurados correctamente, lo verificaron con puntos de interrupción). Aquí está el código:

- (void) setTimerForAlarm:(Alarm *)alarm { 
    NSTimeInterval seconds = [[alarm alarmDate] timeIntervalSinceNow]; 
    theTimer = [NSTimer timerWithTimeInterval:seconds 
          target:self 
          selector:@selector(showAlarm:) 
          userInfo:alarm repeats:NO]; 
} 

- (void) showAlarm:(Alarm *)alarm { 
    NSLog(@"Alarm: %@", [alarm alarmText]); 
} 

El objeto "theTimer" se deined con @property:

@interface FooAppDelegate : NSObject <NSApplicationDelegate, NSWindowDelegate> { 
@private 

    NSTimer *theTimer; 

} 

@property (nonatomic, retain) NSTimer *theTimer; 

- (void) setTimerForAlarm:(Alarm *)alarm; 
- (void) showAlarm:(Alarm *)alarm; 

¿Qué estoy haciendo mal?

+2

La firma del método para 'showAlarm: (Alarma *) alarma' debe ser' showAlarm: (NSTimer *) timer' en su lugar. Luego obtendría el objeto Alarm con 'Alarm * alarm = [timer userInfo]'. – 0xced

+0

Gracias, ya lo tengo ;-) – tamasgal

Respuesta

27

timerWithTimeInterval simplemente crea un temporizador, pero no lo agrega a ningún bucle de ejecución para su ejecución. Pruebe

self.theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
         target:self 
         selector:@selector(showAlarm:) 
         userInfo:alarm repeats:NO]; 

en su lugar.

+0

OK, eso fue obvio ;-) Lo pasé por alto en todos los ejemplos ... – tamasgal

7

Ha creado un objeto NSTimer pero no ha programado que se ejecute. timerWithTimeInterval: target: selector: userInfo: repeats: crea un temporizador que puede programar para ejecutarse más tarde, por ejemplo, para crear un temporizador en el inicio de la aplicación y hacer que comience a contar cuando el usuario presiona un botón. O bien llamar

[[NSRunLoop currentRunLoop] addTimer:theTimer forMode:NSDefaultRunLoopMode] 

al final de setTimerForAlarm o reemplazar

theTimer = [NSTimer timerWithTimeInterval:seconds 
          target:self 
          selector:@selector(showAlarm:) 
          userInfo:alarm repeats:NO]; 

con

theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
          target:self 
          selector:@selector(showAlarm:) 
          userInfo:alarm repeats:NO]; 

que crea un temporizador e inmediatamente lo programa.

+0

+1 por ser correcto y minucioso! (De hecho, tengo que esperar hasta la medianoche para enviar un voto positivo: ya he usado mippy del día). –

2

Bueno, es posible que desee programar realmente su NSTimer en el ciclo de ejecución :) en lugar de timerWithTimeInterval usar scheduledTimerWithTimeInterval.

theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
         target:self 
         selector:@selector(showAlarm:) 
         userInfo:alarm repeats:NO]; 
2

Mientras que todas las respuestas están en lo cierto, no es una solución aún más simple que no implica un NSTimer en absoluto. Su aplicación setTimerForAlarm: puede reducirse a una simple línea:

[self performSelector:@selector(showAlarm:) withObject:alarm afterDelay:[[alarm alarmDate] timeIntervalSinceNow]] 
+0

Gracias, pero NSTimer es la mejor opción en este momento, porque también quiero cancelar el temporizador en cualquier momento. :-) – tamasgal

+0

También puede cancelar un 'performSelector: withObject: afterDelay:' con '+ [NSObject cancelPreviousPerformRequestsWithTarget: selector: object:]' – 0xced

+1

¡Gracias por esta publicación! Es un ahorro de tiempo enorme y mi código es más compacto. – Adrian

8

Tampoco se olvide de comprobar si

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds 
            target:(id)target 
            selector:(SEL)aSelector 
            userInfo:(id)userInfo 
            repeats:(BOOL)repeats 

se llama en el hilo principal.

+1

¡esto es realmente importante! fue la causa de que mi temporizador no disparara – jere

Cuestiones relacionadas