第二次加载视图时按下按钮时NSTimer不稳定

时间:2014-07-10 11:10:10

标签: ios objective-c cocoa-touch nstimer nsrunloop

我正在使用NSTimer创建一个游戏视图控制器来更新表示当前游戏回合剩余时间的进度条。此游戏视图还显示执行一些轻核心数据更新的按钮。 当剩余时间结束时,计时器无效并按下新视图。

游戏视图第一次在应用程序生命周期中加载,它完美运行:按下按钮并更新核心数据时没有减速。 但是当我在应用程序生命周期中推回相同的游戏视图时,按下按钮会使进度条波动并且不负责任。

运行循环中NSTimer是否未正确无效?我应该使用CADisplayLink代替,虽然我的观点没有使用大量资源吗?

提前致谢。

这是我的代码:

.h文件中的计时器声明:

@property (weak, nonatomic) NSTimer *updatetimer;

viewDidLoad中创建计时器:

self.updatetimer = [NSTimer timerWithTimeInterval:counterStep target:self selector:@selector(updateProgress) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.updatetimer forMode:NSRunLoopCommonModes];

updateProgress功能:

  - (void)updateProgress
    {
        //compute current time
        currentTime = currentTime - counterStep;

        //set timer label to int value of current time
        self.timerLabel.text = [[NSString alloc] initWithFormat:@"%d",[[NSNumber numberWithDouble:currentTime] intValue]];

        //update progress bar accordingly
        [self.progressbar setProgress: currentTime / totalTime animated:YES];

        if(currentTime <= 0) 
        {   
            //call the method that invalidates the timer + pushes to the next view
            [self overallTimeEnd];
        }
    }

计时器失效:

[self.updatetimer invalidate];
self.updatetimer = nil;

2 个答案:

答案 0 :(得分:0)

这里诊断问题还不够。鉴于您已确认您的初始计时器已成功无效,接下来要检查的是确保问题确实是updateProgress未以所需频率调用(而不是更新的任何内容) updateProgress依赖的状态变量。

但是,让我们假设问题确实是updateProgress未被调用所需的频率。如果是这样,那么您可能正在该主线程上运行的东西阻止计时器以所需频率运行。很难说没有看到updateProgress正在做什么,更不用说你可能在主线程上运行的其他东西了。 WWDC 2012视频Building Concurrent User Interfaces on iOS说明了如何使用Instruments查找可能对并发UX产生负面影响的内容。

最后,updateProgress让我们了解的基础流程并不清楚,但是如果你可以采用事件驱动的方法(例如,如果是网络连接,则将UI更新为{{1}调用而不是使用计时器。有时您必须使用计时器,但如果您可以避免使用计时器,您可能可以提高应用程序的效率。

答案 1 :(得分:0)

所以,终于找到了导致我的计时器在应用程序生命周期中没有被释放的原因:我没有在我的故事板中使用展开segue在视图之间返回但是标准推送segue。 从来没有使用过这些,也没有人知道它们...... 感谢大家的帮助。