您好我试图通过使用“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相当新,不知道如何访问它
答案 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;
}