2010-02-07 24 views
6

He estado usando un NSTimer con éxito, pero ahora estoy teniendo problemas con él. Sin dudas algo estúpido. Apreciar otro par de ojos. Al ejecutar el depurador, veo que se llama a applicationDidFinishLaunching, pero nunca se invoca el desencadenador.NStimer: ¿qué estoy haciendo mal aquí?

-(void) trigger:(NSTimer *) theTimer{ 
    NSLog(@"timer fired"); 
} 

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger) userInfo:nil repeats:YES]; 

    [window makeKeyAndVisible]; 
} 
+0

Además de lo que se ha dicho a continuación, debe conservar el temporizador si no está utilizando la recolección de elementos no utilizados. –

+2

Si agrega el temporizador para ejecutar el ciclo, no hay necesidad de retenerlo, creo que el ciclo de ejecución lo retiene. – Jaanus

+0

Gracias a todos por detectar el error de firma de método. La otra cosa que me estaba molestando es que yo había estado usando scheduleTimerWithInterval, que no requiere adición manual a un ciclo de ejecución. En este caso, sin embargo, me había olvidado de la parte programada del temporizador. – morgancodes

Respuesta

13

El selector debe tener la siguiente firma:

- (void)timerFireMethod:(NSTimer*)theTimer 

por lo que necesita

@selector(trigger:) 

--edit--

Quizás esté haciendo esto en otro lugar, pero en el código incluido, en realidad no se inicia el temporizador. Tienes que agregarlo a un NSRunLoop antes de que pueda desencadenar cualquier evento.

[[NSRunLoop currentRunLoop] addTimer:nst forMode:NSDefaultRunLoopMode]; 

Si leo los ejemplos correctamente. Solo he usado el método init que lo agrega automáticamente al NSRunLoop actual. Deberías mirar los documentos de desarrollador que alguien incluyó en los comentarios a mi publicación.

+1

bleh too slow again, sorry noah :) – willcodejavaforfood

+0

+1 Aquí está la documentación relevante: http://developer.apple.com/mac/library/documentation/cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html # // apple_ref/occ/clm/NSTimer/timerWithTimeInterval: target: selector: userInfo: repeats: –

+1

para aclarar: -: es parte del nombre del método. De hecho: es un nombre de método totalmente válido para un método con un argumento. –

1

El selector que está dando el temporizador, trigger, indica que se debe llamar a un método que toma ningún parámetro. O bien cambiar su método de temporizador como combustible para

- (void)trigger 
{ 
     // look at me, I don't take any parameters 
     NSLog(@"timer fired"); 
} 

o cambiar su cronómetro de llamada inicial para utilizarlo @selector(trigger:).

+1

La devolución de llamada del temporizador debe tener un argumento, por lo que cambiar el nombre del método a "desencadenar" no va a funcionar –

+2

@jib - No, eso no es cierto. La devolución de llamada del temporizador funciona bien sin el argumento NSTimer. Lo hago todo el tiempo. –

2

Dos cosas:

1) como dicen otros, el método debe tener la siguiente firma ..

-(void) trigger:(NSTimer *) theTimer; 

y que realice el temporizador así:

nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger:) userInfo:nil repeats:YES]; 

2) meramente crear el temporizador no lo ejecuta. Como the documentation says:

Debe agregar el nuevo temporizador a un bucle de ejecución , utilizando addTimer: forMode :. Luego, después de que hayan transcurrido los segundos, el temporizador dispara, invocando la invocación. (Si el temporizador está configurado para repetir, hay hay necesidad de volver a añadir posteriormente el temporizador al bucle de ejecución.)

Aquí es una pieza de código funcionamiento real que se puede modelar después. La creación del temporizador es la misma que la tuya, pero también se agrega a runloop de la manera correcta.

[[NSRunLoop currentRunLoop] addTimer: 
    [NSTimer timerWithTimeInterval:0.1 
          target:self 
          selector:@selector(someSelector:) 
          userInfo:nil 
          repeats:NO] 
           forMode:NSDefaultRunLoopMode]; 
+4

+1 esto es correcto. También puede usar los métodos de conveniencia 'scheduledTimer ...' que agregarán el temporizador al ciclo de ejecución por usted. –

0

Su problema es debido al hecho de que timerWithTimeInterval:target:selector:userInfo:repeats: crea un temporizador pero lo hace no horario en el bucle de ejecución, usted tiene que hacerlo usted mismo.

Sin embargo, es posible también utilizar este método que crea el temporizador y lo programa en el bucle de ejecución: scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

0

que tenía un problema cuando se inicia el temporizador en - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { no en el hilo principal.

dispatch_async(dispatch_get_main_queue(), ^{ 
[self startScheduledTimer]; 
}); 
Cuestiones relacionadas