NSTimer 毫秒精度

NSTimer Milliseconds Accuracy

我有一个 9 位数的数字需要每秒增加 500,但我决定每毫秒增加一个数字并更新显示数字的标签。我使用的是 NSTimer,但正如我在周围阅读的那样,它们既不准确也不准确。我试过使用 CFAbsoluteTimeGetCurrent 但无法正常工作。简单地使用 NSTimer 会产生不准确的值。递增不会在用户每次打开应用程序时停止,它只是将值相加并再次开始递增。 有什么想法吗?

更新:

尽管大多数答案都指向正确的方向,但我解决问题的方式有点不同。感谢所有回答者和 Martin。

我使用 CADisplayLink 而不是 NSTimer 并得到了非常准确和稳定的结果。现在请注意,我说漂亮是因为结果并不完全准确,但因为在我的情况下我增加了一个 9 位数,所以它们并不引人注意,一旦视图再次出现,我的数字就会得到纠正。

仅将计时器用作更新屏幕的触发器,不要依赖每次触发之间的确切时间。

保留一个代表开始时间的 NSDate,并在计时器触发时使用当前日期来计算差异并更新标签。

时间不会非常准确 - 但不需要,如果每次进入循环并添加 500 x(秒数)时都获得准确的当前时间,您将获得每秒增加 500 的显示(正负 50-100 毫秒)

这种方法的优点是您不会在时间上出现 ever-increasing 差异,只有 50-100 毫秒。

如果您希望计时器在用户退出应用程序时停止,则需要在应用程序变为非活动状态时禁用计时器 - 请查看 Ray Wenderlich 网站上的教程 http://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial

考虑使用 CADisplayLink 来更新您的界面 — 它会为您提供自上一帧绘制以来经过的非常准确的时间数字,因此您可以始终保持 UILabel 最新,无论你的帧率有多高或多低。

你可以获得准确性

timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(countup)userInfo:nil repeats:YES];