2012-02-19 8 views
5

Per la vita di me, non riesco a capire perché questo NSTimer non sparerà. ecco tutto il codice che appare rilevante (almeno per me)NSTimer non sparato

- (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]; 
} 

Ho letto la documentazione di mele, e altre domande, ma non riesco a capirlo. Non chiama nemmeno lo timerDireMethod: una volta. Ho sentito che questo potrebbe essere causato da diversi thread, ma per quanto posso dire, non sto usando più thread.

Tutte le idee sono benvenute.

+0

possibile duplicato del [NSTimer non sparare] (http://stackoverflow.com/questions/6752234/nstimer-not-firing) – Caleb

+0

C'è qualche motivo che si sta utilizzando NSEventTrackingRunLoopMode invece di NSDefaultRunLoopMode? – Caleb

+0

Scusa È tardi qui. L'ho notato e lo aggiungerei alla domanda. ma sì NSDefaultRunLoopMode ha funzionato. Scusa per averti confuso. –

risposta

9

Da NSTimer documentation per Mac OS X:

è necessario aggiungere il nuovo timer per un ciclo corsa, utilizzando addTimer: forMode :. Quindi, trascorsi secondi secondi, il timer scatta, inviando il messaggio aSelector. (Se il timer è configurato in modo da ripetere, non v'è alcuna necessità di seguito aggiungere nuovamente il timer per il ciclo di esecuzione.)

Personalmente, io di solito uso +[NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:]

noti inoltre che se si chiama questo metodo su un thread in background o in un'operazione di blocco che viene eseguita in una coda in background, NSTimer viene distrutto quando il thread in background viene eseguito. Quindi assicurati di eseguirlo sul thread principale o nella coda principale, se appropriato per la tua situazione.

+1

+1 Le grandi menti pensano allo stesso modo. ;-) – Caleb

+0

Ha, bel lavoro di squadra! – bneely

+0

L'ho usato ma non funziona ancora. – shim

1

Leggere la documentazione per il metodo che si sta utilizzando, +timerWithTimeInterval:target:selector:userInfo:repeats::

è necessario aggiungere il nuovo timer per un ciclo corsa, utilizzando addTimer: forMode :. Quindi, trascorsi secondi secondi, il timer scatta, inviando il messaggio aSelector.

+1

+1 Le grandi menti pensano allo stesso modo. ;-) – bneely