【发布时间】:2011-08-22 18:26:51
【问题描述】:
我正在开发一个使用 NSTimer 进行倒计时的 iOS 应用。这很容易被用户篡改:例如,如果用户退出应用程序,手动关闭应用程序,更改设备时钟,然后返回,则必须重新创建计时器。另一种情况:用户锁定设备,进入低功耗模式(需要重新创建计时器),并且在再次打开游戏之前自动设置时钟。如果发生这种情况,我将无法准确确定应用程序关闭后经过了多长时间,因为设备时钟已更改。
Tl;dr:倒计时计时器有时必须在设备时钟更改后重新创建。这个问题一般是怎么处理的?
【问题讨论】:
-
在任何人建议之前:我已经看到 mach_absolute_time() 大肆宣传,但是 a) 对于高级问题,它似乎是一种非常低级的方法,并且 b) 因为 AFAIK 它使用CPU 滴答测量时间,我想它不如石英钟准确。
-
您想用最后一个已知时间重新创建计时器,还是想从头开始?如果您想使用最后一次重新创建它,那么也许您可以在应用即将更改状态时将时间保存到用户首选项,并在应用返回时从用户首选项中读取。
-
我希望它看起来好像计时器在后台滴答作响,就像什么都没发生一样。示例:用户在还剩 10 秒时切换,并将时间更改为提前 1 小时。这需要用户 5 秒。当用户回来时,计时器应该说 5 秒。
-
您需要时钟有多准确?通常,您需要在“applicationDidResignActive”等函数中保存计时器中剩余的时间和时间量,并在“applicationDidBecomeActive”上使用此数据创建一个新计时器。确切的实施应根据所需的准确性而有所不同。
-
它不需要非常精确,只要合理——几秒钟内。我已经在 applicationDidResignActive 中保存了时间数据,但是如果系统时间发生变化,我无法测量程序处于非活动状态的时间。
标签: objective-c ios time timer