2012-02-19 11 views
5

Por mi vida, no puedo entender por qué este NSTimer no se disparará. aquí está todo el código que aparece relevante (al menos para mí)NSTimer no dispara

- (IBAction)connectClick:(id)sender 
{ 
    if (connected) 
    { 
     NSLog(@"Disconnecting"); 
     [timer invalidate]; 
     timer = nil; 
     connected = NO; 
     [Connect setStringValue:@"Connect"]; 
     NSLog(@"Finished\n"); 
    } 
    else 
    { 
     NSLog(@"Connecting"); 
     timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES]; 
     //[timer fire]; tested this line. same results 
     [Connect setStringValue:@"a"]; 
     connected = YES; 
     NSLog(@"Finished\n"); 
    } 
} 

- (void)timerFireMethod:(NSTimer*)theTimer 
{ 
    NSLog(@"Fireing event"); 
    //[self resetRequest]; 
    //[spinner startAnimation:nil]; 
    //[request startAsynchronous]; 
} 

He leído los documentos de manzana, y otras preguntas, pero no puedo entenderlo. Ni siquiera llama al timerDireMethod: una vez. He oído que esto podría ser causado por diferentes hilos, pero por lo que puedo decir, no estoy usando múltiples hilos.

Todas las ideas son bienvenidas.

+0

posible duplicado de [NSTimer no disparar] (http://stackoverflow.com/questions/6752234/nstimer-not-firing) – Caleb

+0

¿Hay alguna razón por la que usted está utilizando en lugar de NSEventTrackingRunLoopMode NSDefaultRunLoopMode? – Caleb

+0

Lo siento Es tarde aquí. Me di cuenta de eso e iba a agregar eso a la pregunta. pero sí NSDefaultRunLoopMode funcionó. Disculpa por confundirte. –

Respuesta

9

De NSTimer documentation para Mac OS X:

debe agregar el nuevo temporizador a un bucle de ejecución, utilizando addTimer: forMode :. Luego, transcurridos segundos segundos, el temporizador se dispara, enviando el mensaje aSelector al destino. (Si el temporizador está configurado para repetir, no hay necesidad de, posteriormente, volver a agregar el contador de tiempo para el bucle de ejecución.)

Personalmente, me suelen utilizar +[NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:]

También tenga en cuenta que si se llama a este método en un hilo de fondo, o en una operación de bloque que se ejecuta en una cola de fondo, el NSTimer se destruye cuando lo hace el hilo de fondo. Así que asegúrese de ejecutarlo en el hilo principal o en la cola principal, si corresponde para su situación.

+1

+1 Las grandes mentes piensan igual. ;-) – Caleb

+0

¡Ja, buen trabajo en equipo! – bneely

+0

Lo usé pero todavía no está disparando. – shim

1

Lea la documentación para el método que está utilizando, +timerWithTimeInterval:target:selector:userInfo:repeats::

debe agregar el nuevo temporizador a un bucle de ejecución, utilizando addTimer: forMode :. Luego, transcurridos segundos segundos, el temporizador se dispara, enviando el mensaje aSelector al destino.

+1

+1 Las grandes mentes piensan igual. ;-) – bneely