2012-08-30 12 views
6

Ich möchte kein NSTimer-Objekt erstellen. Wie kann ich den Timer ungültig machen? Ich möchte den Timer in viewWillDisappear ungültig machen.Wie kann ich den Timer ungültig machen, wenn ich kein NSTimer-Objekt erstelle?

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

Was meinen Sie mit * Ich möchte kein NSTimer Objekt * erstellen? Sie erstellen bereits eines mit 'planedTimerWithTimeInterval'. – sch

+0

Ich meine, ich halte den Timer, den ich erstelle, nicht fest. Ist es möglich? – Voloda2

Antwort

3

A

Sie den Timer zu halten, haben Sie erstellen:

@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

eine andere Option wäre, um den Timer zu entkräften, die vergangen ist, im Callback, aber das wird nicht innerhalb viewDidUnload: auftreten. daher ist es nicht ganz in diesem Szenario gelten:

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

Vielleicht diese Methode kann Ihnen helfen:

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

Wenn Sie in der Lage sein wollen, um den Timer abzubrechen, müssen Sie auf die beziehen Timer, den du annullierst, und das bedeutet, du musst den Zeiger auf den Timer halten, siehe Justins Antwort.

Einen Verweis auf den Timer zu halten ist der richtige Weg, aber der Vollständigkeit halber können Sie auch die -performSelector:withObject:afterDelay: Methode als armes Man's Timer verwenden. Dieser Anruf kann mit +cancelPreviousPerformRequestsWithTarget: ungültig gemacht werden. Beispielcode:

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

Und dann:

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

Aber das ist nicht der richtige Weg, es zu tun, weil es andere seine Anfrage durchführen-Selektor auf Ihrem Objekt anhängig, die Sie aufheben würden. Es ist am besten, den Timer in der Nähe zu halten, damit Sie genau wissen, was Sie stornieren.

Es ist übrigens auch eine schlechte Idee, einen Timer in -viewDidLoad zu starten. Das Laden der Ansicht kann jederzeit erfolgen, ohne dass eine Beziehung zur Anzeige der Ansicht besteht.

0

Wenn Sie Ihren Timer nicht behalten möchten, wird das NSTimer-Objekt an die Timer-Methode übergeben (in Ihrem Fall onTimer :), so dass Sie überprüfen können, ob der Timer noch benötigt wird und ungültig wird es. Sie werden jedoch in Schwierigkeiten geraten, wenn die Ansicht zurückkehrt, bevor Sie den Timer ungültig gemacht haben, und Sie eine neue erstellen.

Bei weitem der beste Weg ist, den Timer in eine Instanzvariable zu speichern. Es funktioniert, keine schlauen Tricks, und Sie wissen sechs Monate später, was Sie getan haben. Ich würde wahrscheinlich ein

@property (readwrite, nonatomic) BOOL hasTimer; 

Getter JA zurückgibt schreiben iff der Timer nicht Null ist, Setter entkräftet den Timer oder eine neue erstellt.

Verwandte Themen