2012-02-19 18 views
5

Dla mojego życia, nie mogę się domyślić, dlaczego ten NSTimer nie będzie strzelał. tutaj jest cały kod, który pojawia się istotne (przynajmniej dla mnie)NSTimer nie strzela

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

Czytałem docs Apple oraz inne pytania, ale nie mogę zrozumieć. Nawet nie nazywa się timerDireMethod:. Słyszałem, że może to być spowodowane przez różne wątki, ale o ile mogę powiedzieć, nie używam wielu wątków.

Wszystkie pomysły mile widziane.

+0

możliwe duplikat [NSTimer nie wypalanie] (http://stackoverflow.com/questions/6752234/nstimer-not-firing) – Caleb

+0

Czy jest jakiś powód, dla którego używasz NSEventTrackingRunLoopMode zamiast NSDefaultRunLoopMode? – Caleb

+0

Przepraszam za spóźnienie. Właśnie to zauważyłem i zamierzałem dodać to do pytania. ale tak działa NSDefaultRunLoopMode. Przepraszam za zamieszanie. –

Odpowiedz

9

Od NSTimer documentation dla Mac OS X:

Należy dodać nowy licznik do pętli biegu, korzystając addTimer: forMode :. Następnie, po upływie sekund sekund, zegar uruchamia się, wysyłając wiadomość do wybranego celu. (Jeśli zegar jest skonfigurowany tak, aby powtórzyć, nie ma potrzeby, aby następnie ponownie dodać licznik do pętli wykonywania.)

Osobiście zazwyczaj korzystają +[NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:]

Należy również pamiętać, że jeśli nazywają to metoda na wątku w tle lub w operacji bloku, która działa w kolejce tła, NSTimer ulega zniszczeniu, gdy wątek tła ma. Dlatego upewnij się, że uruchamiasz go w głównym wątku lub w głównej kolejce, jeśli jest to odpowiednie dla twojej sytuacji.

+1

+1 Wielkie umysły myślą podobnie. ;-) – Caleb

+0

Ha, miła praca zespołowa! – bneely

+0

Użyłem tego, ale nadal nie strzelam. – shim

1

Przeczytaj dokumentację dla metody, której używasz, +timerWithTimeInterval:target:selector:userInfo:repeats::

należy dodać nowy timer do pętli biegu, korzystając addTimer: forMode :. Następnie, po upływie sekund sekund, zegar uruchamia się, wysyłając wiadomość do wybranego celu.

+1

+1 Wielkie umysły myślą podobnie. ;-) – bneely