2012-08-30 11 views
6

Nie chcę tworzyć obiektu NSTimer. Jak mogę unieważnić timer? Chcę unieważnić timer w viewWillDisappear.Jak unieważnić licznik czasu, gdy nie utworzę obiektu NSTimer

-(void) viewDidLoad 
{ 
[super viewDidLoad]; 
[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; 
} 
+0

Co masz na myśli przez * Nie chcę tworzyć obiektu NSTimer *? Już utworzyłeś jeden używając 'scheduledTimerWithTimeInterval'. – sch

+0

Chodzi mi o to, że nie trzymam timera, który tworzę. Czy to możliwe? – Voloda2

Odpowiedz

3

trzeba trzymać się czasomierz tworzyć:

@interface MONObject() 
@property (nonatomic, retain) NSTimer * timerIvar; 
@end 

@implementation MONObject 
... 
- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
self.timerIvar = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; 
} 

- (void)invalidateTimer 
{ 
    [self.timerIvar invalidate]; 
    self.timerIvar = nil; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    ... 
    [self invalidateTimer]; 
} 

B

innym rozwiązaniem byłoby unieważnienie timer, który jest przekazywany w wywołaniu zwrotnym, ale to nie nastąpi w ciągu viewDidUnload:. dlatego, że nie dość zastosowania w tym scenariuszu:

- (void)onTimer:(NSTimer *)pTimer 
{ 
    [pTimer invalidate]; 
} 
0

Może ta metoda może pomóc:

[self performSelector:@selector(onTimer:) withObject:nil afterDelay:10]; 
1

Jeśli chcesz być w stanie anulować timer, trzeba odwołać się do timer, który anulujesz, a to oznacza, że ​​musisz trzymać wskaźnik na czasomierzu, zobacz odpowiedź Justina.

Utrzymywanie odniesienia do licznika czasu jest właściwym sposobem, ale w celu uzyskania kompletności możesz również użyć metody -performSelector:withObject:afterDelay: jako zegara czasu dla biedaka. To połączenie może zostać unieważnione za pomocą +cancelPreviousPerformRequestsWithTarget:. Przykładowy kod:

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self performSelector:@selector(timerTick) withObject:nil afterDelay:10]; 
} 

A potem:

- (void) viewWillDisappear 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    [super viewWillDisappear]; 
} 

Ale to nie jest właściwy sposób, aby to zrobić, ponieważ mogą istnieć inne wnioski wykonać selektor oczekujące na obiekt, który chcesz skasować. Najlepiej utrzymywać timer, dzięki czemu wiesz dokładnie, co anulujesz.

Nawiasem mówiąc, to także zły pomysł na uruchomienie timera w -viewDidLoad. Widok ładowanie może się zdarzyć w dowolnym momencie, bez żadnego związku z wyświetlaniem widoku.

0

Jeśli nie chcesz trzymać zegara, obiekt NSTimer zostanie przekazany do metody timera (w Twoim przypadku na Timer :), więc w tej metodzie możesz sprawdzić, czy timer jest nadal potrzebny i unieważnić to. Jednak pojawią się kłopoty, jeśli widok powróci, zanim unieważnisz timer i utworzysz nowy.

Zdecydowanie najlepszym sposobem jest zapisanie stopera w zmiennej instancji. Działa, nie ma sprytnych sztuczek, a sześć miesięcy później dowiesz się, co zrobiłeś. pewnie bym napisać

@property (readwrite, nonatomic) BOOL hasTimer; 

getter zwraca TAK IFF timer nie jest zerowa, seter unieważnia timer lub tworzy nową.