这是一个相对简单的问题,我一直没有找到明确的答案。我的应用程序比较复杂,但回答这个问题就足够了。
假设您正在编写一个秒表应用程序。当用户点击“开始”时,应用程序将当前日期和时间存储在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时钟更新的影响吗?
非常感谢!
时间
发布于 2013-07-06 06:06:43
您认为CFAbsoluteTime及其衍生产品(NSDate date等)可能会受到‘实时’网络更新的影响,这是正确的。此外,NSTimer的精确度为50-100ms,而且您的计时器不适合最关键的时间敏感操作。
这个问题的答案似乎是CACurrentMediaTime。它是Core Animation组的成员,但将其集成到基于非动画的应用程序中应该没有任何问题。
CACurrentMediaTime是mach_absolute_time()的包装器,它解释了"mach绝对时间单位“,据我所知,摆弄它并不是件有趣的事情。自上次启动设备以来,通过运行非网络同步计时器来计算mach_absolute_time()。
关于CACurrentMediaTime的信息相对较少,但这里有一些来源和进一步的阅读:
注意:如果使用CACurrentMediaTime,请确保包含并链接QuartzCore.framework
发布于 2013-07-06 05:03:01
查看this here。我会说忘记当前时间检查,使用精确的计时器,因为它不依赖于当前时间,而是使用时间间隔。
https://stackoverflow.com/questions/17496655
复制相似问题