我的问题很简单(我认为)。我有一个实现简单计时器的类(使用一些整数和NSTimer
)。我想关闭我的应用程序(所以进入后台模式)但我希望我的计时器仍然继续计数。我该如何管理?
非常感谢!
答案 0 :(得分:1)
保存启动计时器时出现的时间。像self.timerStartDate = [NSDate date];
这样的东西。每秒调用一次NSTimer并递增一个整数会给你非常不准确的结果
来自NSTimer Class Reference:
计时器不是实时机制;只有当添加了计时器的其中一个运行循环模式正在运行并且能够检查计时器的触发时间是否已经过去时,它才会触发。由于典型的运行循环管理各种输入源,因此定时器的时间间隔的有效分辨率被限制在50-100毫秒的量级。如果在长时间标注期间或在运行循环处于不监视计时器的模式下发生计时器的触发时间,则计时器在下次运行循环检查计时器之前不会触发。因此,计时器可能发射的实际时间可能是计划发射时间之后的一段很长时间。
如果您使用保存startTime的方法,如果程序未运行,您的计时器甚至会“运行”
编辑:
是。使用计时器来计算时间是错误的
我刚写了一个小测试用例。一个带有12行简单tableview的应用程序。两个定时器,一个每毫秒发射一次,另一个每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];
但我想知道你为什么每毫秒需要一个不同的timeStamp