Ios &引用;“校准”;用于UI更新的NSTimer

Ios &引用;“校准”;用于UI更新的NSTimer,ios,macos,cocoa,cocoa-touch,Ios,Macos,Cocoa,Cocoa Touch,我正在尝试为我的程序实现倒计时功能。这是第二个计时器,因此我使用时间间隔为1.0秒的NSTimer对象来更新UI。但为了不累积错误(每1.0秒的间隔将产生一点延迟),程序计算当前时间和UI中显示的剩余时间的开始时间之间的绝对差值 问题是,在NSTimer对象运行了相当长的时间(比如半小时)后,由于累积错误,它不再与绝对时间“同步”:UI更新发生在两个“绝对”秒之间。例如,如果倒计时开始于00:00:00.000,则在00:00:01.000,00:00:02.000,第一次UI更新时。。。但是过

我正在尝试为我的程序实现倒计时功能。这是第二个计时器,因此我使用时间间隔为1.0秒的
NSTimer
对象来更新UI。但为了不累积错误(每1.0秒的间隔将产生一点延迟),程序计算当前时间和UI中显示的剩余时间的开始时间之间的绝对差值

问题是,在
NSTimer
对象运行了相当长的时间(比如半小时)后,由于累积错误,它不再与绝对时间“同步”:UI更新发生在两个“绝对”秒之间。例如,如果倒计时开始于
00:00:00.000
,则在
00:00:01.000
00:00:02.000
,第一次UI更新时。。。但是过了一段时间,它变成了
00:30:03.567
或者类似的东西


你知道我该怎么处理吗?有没有其他更好的方法来实现这一点?谢谢

一个高层次的想法是根据您的绝对时间计算来检测计时器何时变得太不同步。当它超过一个特定的阈值时,比如说0.01秒或你想要的任何时间,取消当前计时器,并在适当的延迟后启动一个新的计时器,使其恢复“同步”。

如果你不计算毫秒数,为什么要显示毫秒数?根据延迟的来源,有一种“过采样”可能会有帮助:只需让计时器以亚秒的间隔启动即可。正如@JoshCaswell所说,让计时器运行得更快,不要显示毫秒,或者如果你想让它们显示一段时间,就将它们硬编码为0reason@JoshCaswell@Paulw11否毫秒不显示,我只是以它们为例。真正的问题是显示的是实际时间的舍入(到第二)结果,因此如果<代码> NSTIMER 在中间某个地方结束,显示的时间可以停止更新1秒或者在一个UPDATE中跳转2秒。过采样是个好主意,我将尝试看看能量影响是否可以接受。谢谢!工作起来很有魅力。我特别喜欢你的想法,因为它对能量的影响非常小。非常感谢。