iOS阻止日期/时间更新?

时间:2013-07-05 20:48:47

标签: ios timing

一个相对简单的问题,我无法找到明确的答案。我的应用程序更复杂,但回答这个问题就足够了。

假设您正在编写秒表应用程序。当用户点击“开始”时,应用程序会将当前日期和时间存储在startTime中:

startTime = [NSDate date];

当用户录制“停止”时,应用会将当前日期和时间存储在stopTime:

stopTime = [NSDate date];

持续时间按以下方式计算:

duration = [stopTime timeIntervalSinceDate:startTime];

并显示如下内容:

[durationLabel setText:[NSString stringWithFormat:@"%1.2f", duration]];

我的应用程序的典型持续时间为2到50秒。我需要精确到1/100秒(例如2.86秒)。

我假设iOS设备使用一些协议来保持其时钟准确(蜂窝或NTP源?)。我担心的是,在启动和停止秒表之间,iOS设备上的时钟会更新,这可能导致当前日期/时间向前或向后移动。如果发生这种情况,计算的持续时间将是不准确的。

为了提高代码效率,我看过一些与计时方法有关的帖子。有人建议使用mach_time.h函数,我不熟悉它们。对我来说,这是最好的使用方法并不明显。

是否可以禁用iOS以更新日期&时间? mach_absolute_time()是否不受iOS时钟更新的影响?

非常感谢!

2 个答案:

答案 0 :(得分:1)

您认为CFAbsoluteTime及其衍生物(NSDate date等)可能会因“实际”时间的网络更新而出现错误。再补充一点,NSTimer的准确度为50-100ms,而且你的计时器不适合最关键的时间敏感操作。

这个问题的答案似乎是CACurrentMediaTime。 它是Core Animation组的成员,但将其集成到非基于动画的应用程序中应该没有任何问题。

CACurrentMediaTime是mach_absolute_time()的包装,并且理解了“马赫绝对时间单位”,根据我的理解,修补它并不好玩。 mach_absolute_time()是通过自上次引导设备以来运行非网络同步计时器来计算的。

关于CACurrentMediaTime的信息相对较少,但这里有一些来源和进一步阅读:

注意:如果您使用CACurrentMediaTime,请确保包含并链接QuartzCore.framework

答案 1 :(得分:0)

结帐this here。我会说忘记当前时间检查并使用精确计时器,因为它不依赖于当前时间而是使用间隔。