滚动时不会调用NSTimer周期性任务

时间:2012-05-26 10:00:08

标签: ios scroll nstimer

我有一个NSTimer

timer = [NSTimer scheduledTimerWithTimeInterval:1 
                                         target:self 
                                       selector:@selector(periodicTimer) 
                                       userInfo:nil 
                                        repeats:YES];

哪个

- (void)periodicTimer
{
    NSLog(@"Bang!");
    if (timerStart != nil)
        [timerLabel setText:[[NSDate date] timeDifference:timerStart]];        
}

问题是,在滚动tableview(或执行其他任务)时,标签不会更新,此外,“Bang!”没有出现,所以我认为该方法不会被调用。

我的问题是如何定期更新标签,即使用户正在使用应用界面。

2 个答案:

答案 0 :(得分:25)

您需要将您的计时器添加到UITrackingRunLoopMode,以确保您的计时器在滚动期间也会触发。

NSRunLoop *runloop = [NSRunLoop currentRunLoop];
NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(myTimerAction:) userInfo:nil repeats:YES];
[runloop addTimer:timer forMode:NSRunLoopCommonModes];
[runloop addTimer:timer forMode:UITrackingRunLoopMode];

自: https://stackoverflow.com/a/1997018/474896

答案 1 :(得分:-2)

不确定这个,但我的第一个猜测是,在更新接口时,接口被呈现给定时器的主线程没有机会做任何事情。

您可以为计时器创建一个带有新运行循环的新线程,但这可能是一个丑陋的解决方案。你想要实现你的应用程序中的哪些功能?也许我们可以建议比使用计时器更好的策略。