在主屏幕上运行的定时器iPhone - 目标C.

时间:2010-06-11 18:03:13

标签: iphone objective-c

我有兴趣建立一个基于计时器的游戏,如黑手党战争或类似的东西。我坚持一个问题。

即使应用已关闭,保留计时器的最佳方法是什么?

我应该根据设备时钟执行此操作吗?或者我应该为服务器设置时间,并获取设备启动的时间?

如果有人知道更好的方法,

让我知道。 感谢。

@lessfame

3 个答案:

答案 0 :(得分:1)

我会将您的问题解释为“测量应用启动之间经过的时间的最佳方法是什么?”而不是“当我的应用程序关闭时,如何让计时器触发?”。

没有可靠而准确的方法来测量设备断电时的时间(远程服务器可能无法访问,如果天气多云,可能无法进行天文测量......)。不要打扰。

也就是说,大多数CF / NS API使用CFAbsoluteTime / NSDate(即CFRunLoopTimerGetNextFireDate()和 - [NSTimer fireDate])。如果系统时钟发生变化,我不确定他们会怎么做。

你可以使用mach_absolute_time()(它在内部由某些东西使用),但这只是系统正常运行时间,所以如果手机重新启动它就会失败。我不确定你是否可以获得启动UUID以确定手机是否重新启动。

在一天结束时,CFAbsoluteTimeGetCurrent()或(等效地)[NSDate日期]可能就足够了;如果时间突然在任何一个方向上变化一两天,请确保您的应用程序行为明智。

是的,用户可以通过设置系统时钟来对系统进行游戏。您可以通过偶尔与服务器同步并跟踪同步之间经过的游戏时间来在某种程度上缓解这种情况。如果经过的游戏时间和服务器时间之间的差异很小,那么只需适当加快或减慢游戏速度,以​​便将过去的“游戏时间”带到实时。如果更改很大,您可以从服务器上的最后一个保存点进行恢复,或者让用户等到服务器时间中经过的游戏时间过去,或者其他一些事情。这意味着您无法在初始同步之前开始播放,但无论如何用户必须在线下载应用程序,因此这不是主要问题。

答案 1 :(得分:0)

如果您只需要保留时间并显示自游戏关闭以来已经过了多长时间(即您不需要在时间结束时通知用户),您可以使用[NSDate timeIntervalSinceNow]方法确定两次之间传递的毫秒数。

答案 2 :(得分:0)

如果你说你想知道自某个事件以来经过的时间,你所做的只是记录初始时间,然后记录最后时间并比较差异。

如果您需要倒数计时器来处理某个事件,那么您所做的就是设置一个本地推送通知设置,以便在结束时关闭。