【问题标题】:iOS prevent date/time update?iOS 阻止日期/时间更新?
【发布时间】:2013-07-05 20:48:46
【问题描述】:

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

假设您正在编写一个秒表应用程序。当用户点击“开始”时,应用会将当前日期和时间存储在 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 时钟更新的影响吗?

非常感谢!

提姆

【问题讨论】:

    标签: ios timing


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这很有帮助。我会仔细看看 CACurrentMediaTime。
    【解决方案2】:

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

    【讨论】:

    • 感谢您提供该文档的链接。它似乎更多地与计时器有关(例如,在将来的某个精确时间调用方法)。对于我的类似秒表的应用程序,我只想记下开始时间(用户点击按钮)、停止时间(用户也点击按钮),然后计算并显示持续时间。不需要 NSTimer 或文档中描述的更精确的计时方法。但我很高兴知道这一点以备将来需要,再次感谢您的回复。
    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多