iphone – iOS系统时间更新导致NSTimer / NSDate funkiness

我正在开发一个应用程序,它有一个事件计时器,可以计算一个可以持续很长时间的事件(duh!).

我已经在相当长的时间内使用计时器完成了其他应用程序,之前从未遇到过这个问题.

基本上,正在发生的事情是,当应用程序启动时,我使用[NSDate date]设置NSDate值.然后,我有一个定期触发的预定NSTimer对象,并通过将当前[NSDate date]值与原始值进行比较来检查已经过了多长时间.

据我所知,这是做这种事情的正确方法,但如果我在上一段中有错误的假设,请纠正我.

无论如何,在过去几周内在我的新iPad上进行测试时,我已经不同地(随机地)抓了几次,看起来我的系统时间有点跳跃.在一个例子中,时间似乎已经跳了64秒!这意味着我的计时器标签显示’00:03′,然后立即显示’01:08′(正确添加第二个,然后错误地添加64个)!在其他时候,它导致了一个负面的事件持续时间.

这是一个间歇性的发生,所以我基本上问这是否可能是:

> iOS 5.1错误
>与新iPad特有的硬件有关(在iPad 1st Gen,第二代,几个iPhone / iPod Touch版本等上从未遇到过这个问题……)
>错误代码(我承认这是可能的,但它不像NSDate值变成NSDate值以外的东西,并且我已经检查了我的项目中设置此单例值的每个位置.

有没有人有类似的经历?有人可以帮忙吗?

最佳答案 这不是iOS设备或操作系统版本错误.

如您所见,NSDate API不保证一致,甚至是单调的.它漂移(取决于温度等),然后从蜂窝或NTP源进行校正,之后日期和时间值可以跳跃.

对于单调本地计时器,您可以尝试mach_time.h中的函数.为了获得更好的绝对时间参考,您的应用可以尝试轮询网络时间源.或者您可以将自己的时间函数与两者的某种组合联系起来.

点赞