2

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

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

startTime = [NSDate date];

当用户录制“stop”时,应用程序将当前日期和时间存储在 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 时钟更新的影响?

非常感谢!

蒂姆

4

2 回答 2

1

您认为CFAbsoluteTime它及其衍生产品(NSDate date等等)可能会受到“实时”网络更新的影响,这是正确的。再加上 NSTimer 的精度为 50-100 毫秒,而且您的计时器不适合最关键的时间敏感操作。

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

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

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

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

于 2013-07-05T22:06:43.013 回答
0

在这里查看。我会说忘记当前时间检查并使用精确计时器,因为它不会依赖当前时间而是使用间隔。

于 2013-07-05T21:03:01.297 回答