0

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

更新:

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

我使用 aCADisplayLink而不是 aNSTimer并获得了非常准确和恒定的结果。现在请注意,我说的很漂亮,因为结果并不完全准确,但是因为在我的情况下,我增加了一个 9 位数的数字,它们并不明显,并且一旦视图再次出现,我的数字就会得到纠正。

4

4 回答 4

3

您可以获得准确度

timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(countup)userInfo:nil repeats:YES];
于 2016-01-02T11:47:04.553 回答
2

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

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

于 2016-01-02T10:05:55.327 回答
1

Consider using CADisplayLink to update your interface — it gives you very accurate numbers of the time passed since the previous frame was drawn, so you can always keep your UILabel up to date, regardless of how high or low your framerate is.

于 2016-01-02T10:18:25.623 回答
0

时间不会很准确 - 但不一定如此,如果您每次进入循环时都获得准确的当前时间并添加 500 x(整数秒数),您将获得一个增加的显示每秒增加 500(加/减 50-100 毫秒)

这种方法的优点是你不会在时间上得到越来越大的差异,只有 50-100 毫秒。

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

于 2016-01-02T10:09:54.433 回答