【发布时间】:2010-10-27 08:37:42
【问题描述】:
我的问题很简单(我认为)。我有一个实现简单计时器的类(使用一些整数和NSTimer)。我想关闭我的应用程序(所以进入后台模式),但我希望我的计时器仍然继续计数。我该如何管理?
非常感谢!
【问题讨论】:
标签: iphone objective-c cocoa multitasking
我的问题很简单(我认为)。我有一个实现简单计时器的类(使用一些整数和NSTimer)。我想关闭我的应用程序(所以进入后台模式),但我希望我的计时器仍然继续计数。我该如何管理?
非常感谢!
【问题讨论】:
标签: iphone objective-c cocoa multitasking
保存启动计时器时的时间。类似于self.timerStartDate = [NSDate date];。每秒调用一次 NSTimer 并增加一个整数会给您带来非常不准确的结果。
来自NSTimer Class Reference:
定时器不是实时机制;它仅在已添加计时器的运行循环模式之一正在运行并且能够检查计时器的触发时间是否已过时触发。由于典型的运行循环管理的各种输入源,计时器的时间间隔的有效分辨率被限制在 50-100 毫秒的数量级。如果计时器的触发时间发生在长时间调用期间或运行循环处于不监视计时器的模式下,则计时器不会触发,直到运行循环下次检查计时器。因此,计时器触发的实际时间可能是计划触发时间之后的很长一段时间。
如果您使用保存 startTime 的方法,如果程序未运行,您的 Timer 甚至会“运行”
编辑:
是的。使用计时器计时是错误的。
我只是写了一个小测试用例。一个带有 12 行的简单表格视图的应用程序。两个计时器,一个每毫秒触发一次,另一个每 10 秒触发一次。
在第一个计时器中,我将一个整数加 1,在第二个计时器中,我打印第一个计时器的结果以及自上次打印以来经过的时间,用 mach_absolute_time() 测量。
看看差异,第一次测量还不错,但是如果我开始滚动那个简单的 UITableView,它在我强大的 Mac 上的模拟器中运行,你会得到很大的不同。
2010-10-27 11:16:49.266 MutliTableTest[24726:207] Calculated: 9.988000000000
2010-10-27 11:16:49.267 MutliTableTest[24726:207] Measured : 10.000055888000
2010-10-27 11:16:59.266 MutliTableTest[24726:207] Calculated: 9.986000000000
2010-10-27 11:16:59.267 MutliTableTest[24726:207] Measured : 9.999898500000
2010-10-27 11:17:09.608 MutliTableTest[24726:207] Calculated: 8.091000000000
2010-10-27 11:17:09.609 MutliTableTest[24726:207] Measured : 10.341779530000
2010-10-27 11:17:19.266 MutliTableTest[24726:207] Calculated: 1.966000000000
2010-10-27 11:17:19.267 MutliTableTest[24726:207] Measured : 9.658319274000
2010-10-27 11:17:29.266 MutliTableTest[24726:207] Calculated: 9.991000000000
2010-10-27 11:17:29.267 MutliTableTest[24726:207] Measured : 9.999891531000
所以不要使用 NSTimer,使用 NSDate 并使用 NSTimeInterval ti = [[NSDate date] timeIntervalSinceDate:self.startDate]; 之类的东西获取当前时间和 startTime 之间的差异
但我想知道为什么每毫秒需要一个不同的时间戳
【讨论】: