【问题标题】:iOS System Time Update Causes NSTimer/NSDate funkinessiOS 系统时间更新导致 NSTimer/NSDate 异常
【发布时间】:2012-05-03 17:57:35
【问题描述】:

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

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

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

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

无论如何,在过去几周在我的新 iPad 上进行测试时,我曾多次(并且随机地)发现我的系统时间似乎在跳跃。有一次,时间似乎跳了 64 秒!这意味着我的计时器标签显示“00:03”,然后立即显示“01:08”(正确添加一秒,然后错误添加64)!!!在其他时候,它会导致负面的事件持续时间。

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

  1. iOS 5.1 错误
  2. 与特定于新 iPad 的硬件有关(在 iPad 第一代、第二代、多个 iPhone/iPod Touch 版本等上从未出现过此问题...)
  3. 错误代码(我承认这是可能的,但 NSDate 值不会变成 NSDate 值以外的值,我已经检查了项目中设置此 singleton 值的每个地方。

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

【问题讨论】:

  • 由于图形更新(标签等)发生在主线程中,听起来好像你的主线程被更好地在辅助线程中运行的东西占用和阻塞了。
  • @Till 我不认为是这样,因为它不仅可以向前跳跃(而且远远超过任何延迟会导致),而且它还可以向后跳跃,即使我的应用程序已启动!
  • @mbm30075 好点,这让我不太可能怀疑。

标签: iphone ios ipad nsdate nstimer


【解决方案1】:

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

不保证 NSDate API 是一致的,甚至是单调的,正如您所发现的那样。它会漂移(取决于温度等),然后从蜂窝或 NTP 源得到纠正,之后日期和时间值可以跳跃。

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

【讨论】:

  • 所以,我在想一些类似的东西。我实际上并不关心 NSDate 的日期 时间值(在这种情况下),而是想简单地计算 elapsed 时间。我会看看mach_time.h
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 2013-04-01
  • 2020-01-23
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2017-06-08
  • 2014-02-07
相关资源
最近更新 更多