2012-08-30 34 views
6

我不想創建NSTimer對象。如何使計時器無效?我想在viewWillDisappear中使計時器失效。當我不創建NSTimer對象時,如何使計時器無效

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

你是什麼意思*我不想創建NSTimer對象*?您已經使用'scheduledTimerWithTimeInterval'創建了一個。 – sch

+0

我的意思是我不堅持我創建的計時器。可能嗎? – Voloda2

回答

3

一個

,你必須堅持到計時器創建:

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

另一種選擇是無效傳遞計時器在回調中,但不會發生在viewDidUnload:之內。因此,它並不完全適用於這樣的場景:

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

也許這種方法可以幫助你:如果你希望能夠取消計時器

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

,你必須參考你要取消定時器,這意味着你必須將指針保持在周圍,看賈斯汀的答案。

保持對計時器的引用是正確的方式,但爲了完整起見,您還可以使用-performSelector:withObject:afterDelay:方法作爲窮人的計時器。該電話可能會使用+cancelPreviousPerformRequestsWithTarget:無效。示例代碼:

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

然後:

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

但是,這不是做正確的方式,因爲有可能是你的目標,你將取消掛起其他執行選擇器的請求。最好保留你的計時器,這樣你就知道你要取消什麼。

順便說一下,在-viewDidLoad中運行計時器也可能是個壞主意。查看加載可能隨時發生,與查看顯示沒有任何關係。

0

如果你不想堅持你的計時器,NSTimer對象將被傳遞給定時器方法(在你的情況下onTimer :),所以在這種方法中,你可以檢查定時器是否仍然需要和無效它。但是,如果視圖在您使計時器失效之前回來,您將遇到麻煩,並且您創建一個新的計時器。

到目前爲止,最好的方法是將計時器存儲到實例變量中。它工作,沒有聰明的技巧,六個月後你會知道你做了什麼。我可能會寫一

@property (readwrite, nonatomic) BOOL hasTimer; 

吸氣返回YES當且僅當計時器不爲零,二傳手無效定時器或創建一個新的。