1

嗨,我试图通过使用“无效”来停止 NSTimer,但是从我尝试过的所有事情来看,我似乎无法让计时器停止。这是我必须完成这项工作的代码。我正在尝试从不同的班级停止计时器。

我的计时器

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

综合性强

和停止方法:

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

在我的另一堂课上让它停止我正在这样做:

  [_carTripViewController stopTimer];

然而那是行不通的。它正在执行该方法但不停止计时器。我不确定我是否正在创建一个新实例,这就是它不起作用的原因。我怎样才能让它从另一个班级失效?

谢谢!我对objective-c还很陌生,不知道如何访问它

4

3 回答 3

2

在有关无效方法的文档中, Apple 说:

特别注意事项

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

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

[self performSelectorOnMainThread:@selector(myMethod:) 
    withObject:anObj waitUntilDone:YES];

在您的情况下,例如:

[_carTripViewController performSelectorOnMainThread:@selector(stopTimer:) 
    withObject:nil waitUntilDone:YES];
于 2013-09-15T04:57:17.270 回答
0

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

1)您向stopTimer班级的另一个对象发送消息,而不是启动计时器的对象。

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

于 2013-09-15T04:56:48.270 回答
0

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

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;
}
于 2014-02-11T09:04:38.243 回答