使用NSTimer计划计时器使任务运行速度超出预期

时间:2010-03-15 11:06:22

标签: iphone objective-c nstimer

我在viewWillAppear中安排了一个具有NSTimer功能的计时器,如下所示:

minutesTimer = nil;
minutesTimer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(updateScrollViewItems) userInfo:NULL repeats:YES];

通过这个函数调用,我希望它每分钟都调用一个选择器updateScrollViewItems,但它没有,它更快地更新项目(大约几秒钟)。

这种意外行为的原因是什么?

3 个答案:

答案 0 :(得分:5)

这可能不是您所看到问题的直接原因,但我已经发现了一个重大错误。

每次在viewWillAppear上设置此计时器的事实意味着无论何时出现您的视图,您都会创建一个新计时器(并泄漏旧计时器),该计时器将在创建后60秒启动。

如果您的视图消失并重新出现多次,您将有多个计时器以完全随机的间隔触发相同的方法。

您需要正确管理计时器。如果您希望它在首次创建视图时启动并且即使未显示视图也要保持勾选/触发,那么您需要在initviewDidLoad期间创建它,然后确保在deallocviewDidUnload时停止。

如果您希望计时器仅在视图为当前视图时打勾/触发,那么您需要确保在viewDidAppearviewWillDisappear上正确管理停止和启动计时器。< / p>

此外,正如Williham Totland在回答中所说,NSTimer不应该依赖于确切的时间安排。这也在文档中说明:

  

计时器不是实时机制;只有当添加了计时器的其中一个运行循环模式正在运行并且能够检查计时器的触发时间是否已经过去时,它才会触发。由于典型的运行循环管理各种输入源,因此定时器的时间间隔的有效分辨率被限制在50-100毫秒的量级。如果在运行循环处于未监视定时器的模式或长调出期间发生定时器的触发时间,则定时器在下次运行循环检查定时器之前不会触发。因此,计时器可能发射的实际时间可能是计划发射时间之后的一段很长时间。

在这种情况下,时间跨度为60秒,定时器不准确应该不是问题,我认为你看到的问题是因为定时器没有正确管理。

答案 1 :(得分:0)

iPhone很多东西;然而,一个整洁的设备;就像任何其他计算机一样,它不是精密计时器。但是,似乎所讨论的方法采用的是NSTimeInterval,这是一个双精度数。您可能希望将其更改为60.0

答案 2 :(得分:0)

  

如果您只想要计时器   当视图是当前时,勾选/触发   查看,然后你需要确保你   管理停止和启动   适当的计时器在viewDidAppear上   和viewWillDisappear。

感谢您提供此信息,即使我不是此主题的OP,我也在寻找类似问题的答案。我几天挠头,在互联网上搜索,但我找不到答案。最后我找到了这个帖子。这对我来说是一个有价值的信息。