我使用此代码停止NSTimer
[timer invalidate]
timer = nil;
第一次运行时效果很好。但是,在我用这段代码恢复计时器之后。
timer = [NSTimer scheduledTimerWithTimeInterval:5.0
target:self
selector:@selector(checkNewUpdates)
userInfo:nil
repeats:YES];
使用NSTimer
[timer invalidate]
将不再停止
答案 0 :(得分:3)
看起来多个计时器实例同时运行。您可以做一件事,在开始运行新计时器之前,检查以前的计时器实例,如果计时器实例可用,则使其无效。在此之后启动新实例
if(timer)
{
[timer invalidate];
timer = nil;
}
timer = [NSTimer scheduledTimerWithTimeInterval:5.0
target:self
selector:@selector(checkNewUpdates)
userInfo:nil
repeats:YES];
答案 1 :(得分:1)
在苹果的official document他们说:
您必须从计时器所在的线程发送此消息 安装。如果您从另一个线程发送此消息,则输入 与计时器关联的源可能无法从其运行循环中删除, 这可能会阻止线程正常退出。
如果您的计时器在主线程上运行,请执行以下操作:
[timer performSelectorOnMainThread:@selector(invalidate) withObject:nil waitUntilDone:YES];
如果它在任何其他线程上,让我们调用线程myThread,然后执行以下操作:
[timer performSelector:@selector(invalidate) onThread:myThread withObject:nil waitUntilDone:NO];
希望这会有所帮助.. :)
答案 2 :(得分:0)
只是使激活的选择器内的计时器无效。这将确保您有一个指向正确计时器的指针(这可能是您的invalidate
通话无效的原因:
timer = [NSTimer scheduledTimerWithTimeInterval:5.0
target:self
selector:@selector(checkNewUpdates:)
userInfo:nil
repeats:YES];
请注意checkNewUpdates:
然后,在checkNewUpdates:方法中,执行以下操作:
- (void)checkNewUpdates:(NSTimer*)timer
{
// do somehting
// Then, check if the criteria for stopping the timer has been met, and invalidate it here.
if( self.shouldStopTimer ) // made up variable, use your own criteria.
{
[timer invalidate];
}
}
答案 3 :(得分:0)
我知道这本身并没有回答你的问题;
我可以建议使用轮询机制而不是计时器吗?我过去曾NSTimers
遇到麻烦,投票是个不错的选择。我在下面做了一个简单的。
- (void) doPoll {
// do logic here
if (shoudStop) {
return;
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, X * NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
[self doPoll];
});
}
这只是一个简单的例子,它不会停止retain cycles
如果你选择尝试这个,你应该。
希望它有所帮助。