我试图在用户运行时检测用户是否提前计时。我目前通过比较两个计时器的变化来做到这一点:[NSDate timeIntervalSinceReferenceDate]
和mach_absolute_time。
基本算法是:
然而,似乎mach_absolute_time的增长速度略快于timeIntervalSinceReferenceDate。从短期来看,这不是一个大问题,但随着时间的推移,这种差异会加剧,我们会开始看到很多误报。
此问题似乎与硬件有关。我在iPad 1上根本看不到它,但一位同事在iPad 2上看到它,我在模拟器中看到它。
我已经确认,我将mach_absolute_time转换为秒没有问题,方法是将其替换为CACurrentMediaTime(在引擎盖下使用mach_absolute_time)。我已经尝试将timeIntervalSinceReferenceDate更改为其他计时方法(即:CFAbsoluteTimeGetCurrent)。
我的基本假设是,定时器应以相同的速率增长吗?我的想法是,除非出现根本性错误,否则他们不应该失去同步 - 他们既决定时间,又从不同点开始。
有更好的方法吗?我需要一个完全离线的解决方案 - 我们不能假设互联网连接。
答案 0 :(得分:0)
您可以尝试使用gettimeofday获取当前系统时间的值。这将返回自纪元以来的时间。
答案 1 :(得分:0)
通常,定时器不能保证同步。也许他们来自不同的来源。也许一个与时间服务器同步。
你只关心时钟之间的差异的突然变化,而不是随时间的大漂移。因此,计算时钟之间差异的变化率:
T_Diff := initial difference between clocks
T_Time := time as determined by one clock
Repeat forever:
T_Diff' := new difference between clocks
T_Time' := new time as determined by one clock
# Check if time changed
if abs((T_Diff'-T_Diff)/(T_Time'-T_Time)) > threshold:
time_changed()
# Update state
T_Diff := T_Diff'
T_Time := T_Time'
wait_for_next_update()