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

时间:2012-05-03 17:57:36

标签: iphone ios ipad nsdate nstimer

我正在开发一款应用程序,该应用程序具有事件计时器,该事件计时器可以持续很长时间的事件(duh!)。

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

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

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

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

这是一个间歇性的事件,所以我基本上都在问这是否可能:

  1. iOS 5.1错误
  2. 与新iPad特有的硬件有关(在iPad 1st Gen,第二代,几个iPhone / iPod Touch等版本上从未出现过这个问题......)
  3. 错误的代码(我承认这是可能的,但它不像NSDate值会变成NSDate值以外的东西,而且我已经检查过我项目中的每个地方已设置singleton值。
  4. 有没有人有类似的经历?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

这不是iOS设备或操作系统版本错误。

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

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