我的一个viewControllers中有一个函数,我每10秒执行一次。
我希望此函数在退出视图时停止执行。
我尝试了这种代码的和平:
-(void)viewWillDisappear:(BOOL)animated
{
NSError *error2;
if ([_managedObjectContext save:&error2] == NO) {
NSAssert(NO, @"Save should not fail\n%@", [error2 localizedDescription]);
abort();
}
else
NSLog(@"Context Saved");
[self stopTimer];
NSLog(@"View will disappear now");
}
它基本上调用了方法stopTimer,它将为计时器提供null值。
- (void) stopTimer
{
[timer invalidate];
timer = nil;
}
我的问题是即使我离开了我的观点,我的功能也会继续执行。永远不会停止我怎样才能解决这个问题?
修改
这是我的nstimer调用的函数:
- (void) MyFunctionCalledByNSTimer
{
[timer invalidate];
timer = [NSTimer scheduledTimerWithTimeInterval:10.0f
target:self selector:@selector(Function1) userInfo:nil repeats:YES];
}
我在我的viewController的.m中声明我的nstimer
NSTimer *timer;
如果您需要更多和平的代码,请询问,我将编辑问题。
答案 0 :(得分:3)
由于创建了多个计时器并且仅使您所引用的内容无效,可能会出现问题。
因此,可能正在修改MyFunctionCalledByNSTimer
,如下所示将解决您的问题:
- (void) MyFunctionCalledByNSTimer
{
if(!timer){
timer = [NSTimer scheduledTimerWithTimeInterval:10.0f
target:self selector:@selector(Function1) userInfo:nil repeats:YES];
}
}
现在,只有一个计时器参考,[timer invalidate]
将使计时器无效。
答案 1 :(得分:0)
使用此代码 在主线程上调用stopTimer
-(void)viewWillDisappear:(BOOL)animated
{
NSError *error2;
if ([_managedObjectContext save:&error2] == NO) {
NSAssert(NO, @"Save should not fail\n%@", [error2 localizedDescription]);
abort();
}
else
NSLog(@"Context Saved");
dispatch_async(dispatch_get_main_queue(), ^{
//Your main thread code goes in here
[self stopTimer];
});
NSLog(@"View will disappear now");
}
请记住,您必须从安装了计时器的线程发送无效消息。如果从另一个线程发送此消息,则与该计时器关联的输入源可能不会从其运行循环中删除,这可能会阻止该线程正常退出。