【问题标题】:NSTimer Milliseconds Accuracy [duplicate]NSTimer 毫秒精度 [重复]
【发布时间】:2016-01-02 09:48:04
【问题描述】:

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

更新:

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

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

【问题讨论】:

    标签: ios swift nstimer cadisplaylink


    【解决方案1】:

    你可以获得准确度

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

          • 如果我想每秒更新标签,计时器可以工作。但是我每毫秒显示一次标签,(类似于秒表的增量)。我想每毫秒将数量增加 0.5 并更新标签。
          • 好的 - 错过了!您仍然可以使用相同的方法 - 根据需要尽快触发计时器,并使用准确的时间来确定要显示的内容 您将无法看到计数器显示每毫秒更新一次 - 您实际上多久更新一次需要更新吗?
          • 尽可能多地坚持屏幕的刷新率就可以了。我一定遗漏了一些东西,但是如果我在计时器开始(应用程序启动)时设置开始时间,我的经过时间会越来越长,对吗?因此,结合快速刷新率,每次我运行该功能来更新标签时都会有很大的飞跃。我很困惑。
          猜你喜欢
          • 2016-05-22
          • 1970-01-01
          • 1970-01-01
          • 2014-08-07
          • 2015-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多