IOS - 目标C - 退出视图时如何停止执行周期性功能?

时间:2016-06-09 12:47:21

标签: ios objective-c nstimer

我的一个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;

如果您需要更多和平的代码,请询问,我将编辑问题。

2 个答案:

答案 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");
}

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