停止NSTimer

时间:2013-09-15 04:39:57

标签: ios nstimer

您好我试图通过使用“invalidate”来阻止NSTimer,但是从我尝试过的所有内容我似乎无法让计时器停止。这是我必须完成这项工作的代码。我试图从另一个班级停止计时器。

我的计时器

_tripTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                              target:self
                                            selector:@selector(updateTimerLabel:)
                                            userInfo:[NSDate date]
                                            repeats:YES];

合成且强大

和停止方法:

-(void)stopTimer
{
    [_tripTimer invalidate];
}

并且在我的另一个课程中让它停止我这样做:

  [_carTripViewController stopTimer];
然而,这是行不通的。它正在执行该方法但不停止计时器。我不确定我是否正在创建一个新实例,这就是为什么它不起作用。如何让它从另一个类中失效?

谢谢!我对objective-c相当新,不知道如何访问它

3 个答案:

答案 0 :(得分:2)

关于invalidate method Apple说的话:

  

特别注意事项

     

您必须从计时器所在的线程发送此消息   安装。如果您从另一个线程发送此消息,则输入   与计时器关联的源可能无法从其运行循环中删除,   这可能会阻止线程正常退出。

如果在main方法中创建线程,可以通过调用:

在main方法中停止它
[self performSelectorOnMainThread:@selector(myMethod:) 
    withObject:anObj waitUntilDone:YES];

在你的情况下像:

[_carTripViewController performSelectorOnMainThread:@selector(stopTimer:) 
    withObject:nil waitUntilDone:YES];

答案 1 :(得分:0)

我看到两个最可能的原因:

1)您将stopTimer消息发送到您班级的其他对象,而不是已启动计时器的对象。

2)_tripTimer变量不再指向计时器对象,它指向其他地方,可能为零。

答案 2 :(得分:0)

我有类似的问题,我做的是将计时器添加到我的appDelegade并将其用作我的计时器上下文。我不确定这是否在学术上100%正确,但它对我有用,至少是一个可行的黑客。到目前为止,我没有遇到任何问题,我的应用程序已被广泛使用。请参阅我的代码示例:

if (!self.pollerTimer) {
    self.pollerTimer = [NSTimer scheduledTimerWithTimeInterval:POLLER_INTERVAL
                                                        target:self
                                                      selector:@selector(performPollinginBackground)
                                                      userInfo:nil
                                                       repeats:YES];

    //adds the timer variable and associated thread to the appDelegade. Remember to add a NSTimer property to your appDeledade.h, in this case its the pollerTimer variable as seen
    NUAppDelegate *appDelegate = (NUAppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.pollerTimer = self.pollerTimer;
}

然后当我想从我的应用程序的任何地方停止计时器时,我可以执行以下操作:

NUAppDelegate *appDelegate = (NUAppDelegate *)[[UIApplication sharedApplication] delegate];

if (appDelegate.pollerTimer) {
    [appDelegate.pollerTimer invalidate];
    appDelegate.pollerTimer = nil;
}