无法停止NSTimer

时间:2014-08-14 02:59:37

标签: ios nstimer

我使用此代码停止NSTimer

[timer invalidate]
timer = nil;

第一次运行时效果很好。但是,在我用这段代码恢复计时器之后。

 timer = [NSTimer scheduledTimerWithTimeInterval:5.0
                                     target:self
                                   selector:@selector(checkNewUpdates)
                                    userInfo:nil
                                    repeats:YES];
使用NSTimer

[timer invalidate]将不再停止

4 个答案:

答案 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如果你选择尝试这个,你应该。 希望它有所帮助。