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

Hoa*_*ham 1 iphone objective-c nstimer

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

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

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

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

Jas*_*ien 5

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

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

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

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

如果您希望在视图是当前视图的计时器只蜱/火,那么你需要确保你正在管理停止和适当的启动定时器viewDidAppearviewWillDisappear.

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

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

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