1

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

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

使用此函数调用,我希望它updateScrollViewItems每分钟调用一次选择器,但事实并非如此,它更新项目的速度比预期的要快(大约几秒钟)。

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

4

3 回答 3

5

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

每次都设置此计时器的事实viewWillAppear意味着每当您的视图出现时,您正在创建一个新计时器(并泄漏旧计时器),该计时器将在创建后 60 秒触发。

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

您需要正确管理计时器。如果您希望它在第一次创建视图时启动,并且即使在未显示视图时也保持滴答声/触发,那么您需要在init或期间创建它viewDidLoad,然后确保在您dealloc或时停止它viewDidUnload

如果您希望计时器仅在视图是当前视图时滴答/触发,那么您需要确保在 和 上正确管理停止和启动viewDidAppear计时器viewWillDisappear

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

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

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

于 2010-03-15T11:37:59.903 回答
0

iPhone 有很多东西。然而,还有一个整洁的设备;就像任何其他计算机一样,它不是精密时计。但是,似乎有问题的方法需要一个 NSTimeInterval,它是一个 double。您可能希望将其更改为60.0.

于 2010-03-15T11:28:46.243 回答
0

如果您希望计时器仅在视图是当前视图时滴答/触发,那么您需要确保在 viewDidAppear 和 viewWillDisappear 上适当地管理停止和启动计时器。

感谢您提供此信息,即使我不是该线程的 OP,我也在寻找类似问题的答案。这几天我一直在摸不着头脑,在网上到处搜索,但我找不到答案。最后我找到了这个线程。这对我来说是很有价值的信息。

于 2010-12-13T05:05:28.557 回答