我不想創建NSTimer對象。如何使計時器無效?我想在viewWillDisappear中使計時器失效。當我不創建NSTimer對象時,如何使計時器無效
-(void) viewDidLoad
{
[super viewDidLoad];
[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];
}
我不想創建NSTimer對象。如何使計時器無效?我想在viewWillDisappear中使計時器失效。當我不創建NSTimer對象時,如何使計時器無效
-(void) viewDidLoad
{
[super viewDidLoad];
[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];
}
一個
,你必須堅持到計時器創建:
@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];
}
也許這種方法可以幫助你:如果你希望能夠取消計時器
[self performSelector:@selector(onTimer:) withObject:nil afterDelay:10];
,你必須參考你要取消定時器,這意味着你必須將指針保持在周圍,看賈斯汀的答案。
保持對計時器的引用是正確的方式,但爲了完整起見,您還可以使用-performSelector:withObject:afterDelay:
方法作爲窮人的計時器。該電話可能會使用+cancelPreviousPerformRequestsWithTarget:
無效。示例代碼:
- (void) viewDidLoad
{
[super viewDidLoad];
[self performSelector:@selector(timerTick) withObject:nil afterDelay:10];
}
然後:
- (void) viewWillDisappear
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
[super viewWillDisappear];
}
但是,這不是做正確的方式,因爲有可能是你的目標,你將取消掛起其他執行選擇器的請求。最好保留你的計時器,這樣你就知道你要取消什麼。
順便說一下,在-viewDidLoad
中運行計時器也可能是個壞主意。查看加載可能隨時發生,與查看顯示沒有任何關係。
如果你不想堅持你的計時器,NSTimer對象將被傳遞給定時器方法(在你的情況下onTimer :),所以在這種方法中,你可以檢查定時器是否仍然需要和無效它。但是,如果視圖在您使計時器失效之前回來,您將遇到麻煩,並且您創建一個新的計時器。
到目前爲止,最好的方法是將計時器存儲到實例變量中。它工作,沒有聰明的技巧,六個月後你會知道你做了什麼。我可能會寫一
@property (readwrite, nonatomic) BOOL hasTimer;
吸氣返回YES當且僅當計時器不爲零,二傳手無效定時器或創建一個新的。
你是什麼意思*我不想創建NSTimer對象*?您已經使用'scheduledTimerWithTimeInterval'創建了一個。 – sch
我的意思是我不堅持我創建的計時器。可能嗎? – Voloda2