在阅读NSRunLoop的文档后,我不太了解。我正在产生一个辅助线程,其中包含一个每1秒启动一次的NSTimer。使用performSelectorOnMainThread更新屏幕上的标签..
然而,为了让它工作,我需要一个runloop,但我不明白它的概念?
任何可以尝试解释它的人?
感谢。
答案 0 :(得分:29)
运行循环是有效的:
while(... get an event ...)
... handle event ...;
它在一个线程上运行;主线程具有主事件循环,其中处理用户事件并且发生大多数UI绘图等。 documentation explains it in detail。
但是,在您的情况下,您不需要线程。
听起来你正在做的是定期更新UI中的标签;一些不是非常计算密集的东西。
只需在主线程中安排您的计时器并完成它。无需使用performSelectorOnMainThread:
来启动线程,或者需要保证跨线程保证数据一致性的所有复杂性。
抱歉 - 不明白你的问题。
在内部,运行循环的工作方式是在运行循环中基本上放置一个标志,表示“经过这段时间后,启动计时器”。没有涉及额外的线程,更好的是,它不是轮询检查时间。将运行循环视为有效维护时间轴。它会被动地让时间过去,直到在时间线上发现一些有趣的东西(所有这些都没有投票 - 投票很糟糕。要避免。)
但这确实意味着Timer永远不会100%准确。同样,如果你有一个计时器每秒重复一次,它会随着时间的推移而漂移。
也;而不是直接触发绘图事件。您的计时器应使需要更新的视图无效,然后让底层对象在最佳实际更新屏幕时处理。
答案 1 :(得分:13)
This page很好地解释了这一点。 FTA:
运行循环本质上是在单个线程上运行的事件处理循环。您可以在其上注册潜在的输入源,并将其指向应在这些源上提供输入时应执行的代码。