【问题标题】:Triggering some code on every nth iteration of an NSTimer tick在 NSTimer 滴答的每 n 次迭代中触发一些代码
【发布时间】:2013-01-09 12:38:40
【问题描述】:

我对编码比较陌生,想知道是否有一种常规方法可以在循环的每 n 次迭代中执行一些代码(在这种情况下,是 NSTimer 滴答作响)。

我使用的是CADisplayLink,它每秒更新很多次,40、50 等等。如果我想在每个循环上执行一些代码,比如 500 个循环,有没有标准的方法可以做到这一点?我想我可以将 modulo 运算符和 integer 放在一起,但有没有更好/更规范的方式让新编码员知道?

额外的清晰度(尽管我确信这是一件相当常见的事情..):我有一个每秒计时 60 次的计时器,但我只想在每 10 次迭代时做一些事情。我已经知道我可以使用模数和整数来执行此操作,但我想知道是否有任何其他约定可以处理此类情况。

提前致谢!

【问题讨论】:

  • 你能说得更清楚吗?

标签: objective-c loops iteration modulo modulus


【解决方案1】:

为正确的间隔建立一个专用计时器。

无论您使用的是NSTimer 还是CADisplayLink,如果时间过长,定时器调用都可以合并和抵消。如果您有一个需要 20 帧运行的显示链接,它每秒只会被调用三次(假设刷新间隔为每秒 60 帧)。而且,如果您将计时器设置为每秒运行一次,而在一个实例中运行时间超过两秒半,那么它将“吃掉”下一次迭代,并且将在半秒后运行下一次迭代。

因此,如果您只计算计时器调用次数,您的计时器可能会不同步。要在某个时间间隔内重复做某事,将计时器设置为该时间间隔是绝对最佳的近似值。

拥有像这样的第二个计时器不是性能问题,除非您使用了很多计时器,在这种情况下,您应该标准化一个滴答计时器并为特定时间点安排事件(这仍然与计数不同)以前的迭代)。

【讨论】:

  • 完美,这正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多