一个相对简单的问题,我无法找到明确的答案。我的应用程序更复杂,但回答这个问题就足够了。
假设您正在编写秒表应用程序。当用户点击“开始”时,应用程序会将当前日期和时间存储在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时钟更新的影响?
非常感谢!
添
答案 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。我会说忘记当前时间检查并使用精确计时器,因为它不依赖于当前时间而是使用间隔。