什么是runloop?

Luc*_*uke 19 iphone cocoa objective-c

在阅读了NSRunLoop的文档后,我不太了解.我正在产生一个辅助线程,其中包含一个每1秒启动一次的NSTimer.使用performSelectorOnMainThread更新屏幕上的标签..

然而,为了让它工作我需要一个runloop但我不明白它的概念?

谁能试着解释一下呢?

谢谢.

bbu*_*bum 29

运行循环是有效的:

while(... get an event ...)
    ... handle event ...;
Run Code Online (Sandbox Code Playgroud)

它运行在一个线程上; 主线程具有主事件循环,其中处理用户事件并且发生大多数UI绘图等.该文档解释得很详细.

但是,在您的情况下,您不需要线程.

听起来你正在做的就是定期更新UI中的标签; 一些不是非常计算密集的东西.

只需在主线程中安排您的计时器并完成它.无需启动线程,使用performSelectorOnMainThread:或产生保证跨线程数据一致性的所有复杂性.


对不起 - 不明白你的问题.

在内部,运行循环的工作原理是在运行循环中基本上放置一个标志,表示"经过这段时间后,激活计时器".没有涉及额外的线程,更好的是,它不是轮询检查时间.将运行循环视为有效维护时间轴.它会被动地让时间流逝,直到在时间线上发现一些有趣的东西(所有这些都没有投票 - 投票很糟糕.要避免.)

但这确实意味着Timer永远不会100%准确.同样,如果你有一个计时器每秒重复一次,它会随着时间的推移而漂移.

也; 而不是直接触发绘图事件.您的计时器应使需要更新的视图无效,然后让底层对象在最佳实际更新屏幕时处理.

  • 定时器不会100%准确,但不会随时间漂移.文件说"重复计时器根据预定的发射时间自动重新安排自己,而不是实际发射时间.例如,如果计划在特定时间发射计时器,之后每5秒发射一次,则计划发射时间将始终为原始的5秒时间间隔,即使实际的开火时间延迟. (4认同)
  • 运行循环实际上是超高效的循环结构。您无法编写出高效的循环结构,因为运行循环可以访问原本无法获得的系统信息。因此,在几乎所有情况下,非轮询运行循环比手动滚动while()循环要好得多。 (2认同)

Rod*_*ahn 13

这个页面很好地解释了它.FTA:

运行循环本质上是在单个线程上运行的事件处理循环.您可以在其上注册潜在的输入源,并将其指向应在这些源上提供输入时应执行的代码.