【问题标题】:What's the real point and benefit of having an Run Loop?拥有 Run Loop 的真正意义和好处是什么?
【发布时间】:2009-10-21 13:05:37
【问题描述】:
在阅读有关多线程的苹果文档时,他们谈论了很多关于运行循环的内容。创建运行循环有什么意义?那是为了多次重用用户线程吗?在哪些示例情况下运行循环是个好主意?
这个运行循环与线程有什么关系?让我们以 iPhone OS 应用程序的主运行循环为例。当用户触摸屏幕时,它会触发一个事件。运行循环是否重用主线程以使用一些代码处理事件?还是每次事件发生时run loop都会创建一个新线程?
【问题讨论】:
标签:
iphone
multithreading
【解决方案1】:
如果您希望您的应用在基于事件的现代 UI 上运行,那么运行循环是一个好主意。即,自 DOS 以来的任何内容。
从 Cocoa 到 .NET 到 REALbasic 的所有桌面操作系统运行时都免费为您提供主运行循环。运行循环不断循环,检查事件并将它们传递到需要去的地方。没有它,您将不会获得鼠标、键盘或其他系统事件。当主运行循环终止时,您的应用程序也将自动终止。
通常你不需要对主运行循环做任何事情,或者创建新的。在 Cocoa 中显示模式面板有时会在内部为面板创建一个运行循环,具体取决于行为。这会暂停主运行循环,因此只有面板获取事件。
iPhone 或 Cocoa 应用程序中的主线程运行主运行循环,所有事件都在主线程上传递。您创建的任何额外线程都没有自己的运行循环,除非您自己创建一个。
【解决方案2】:
运行循环是保持应用程序运行的主要结构。
应用程序循环通过运行循环管理事件、计时器等,直到应用程序退出。
run loop 在概念上是一个无限循环:
while( !quit ) {
// Handle events
// Listen for input
// Manage timers
// ...
}
除非您创建额外的线程,否则您不需要显式创建运行循环对象。线程可以拥有自己的运行循环,在其中可以独立管理自己的事件、计时器和处理输入。
想象一下您的应用程序与缓慢的远程服务通信。可以设置一个线程来处理与远程服务的通信。线程运行循环将负责在数据从远程服务可用时读取数据,并可能在从远程服务完全读取数据时在将数据传递到上游之前对其进行处理。
查看developer.apple.com 的 Apple 文档。
【解决方案3】:
我也对 Runloops 感到非常困惑。它们更像是一个事件队列或通知中心,而不是任何与循环相关的东西。因为它们被称为循环,所以我倾向于认为线程或循环中的线程。有一个执行工作的线程被添加到运行循环中,并且与实际循环不同。就像 iKendac 所说,如果你想为任何比 DOS 更先进的现代 UI 编写代码,你需要理解这个概念。从 Swing 到 SWT 到 J2ME 到 Blackberry 到 iPhone,一切都包含这个概念。它们只是名称不同。这是令人困惑的事情。您可以创建新的 RunLoop 并向其中添加内容。添加的东西会很高兴地闲置,永远不会真正运行,因为您必须创建实际线程来泵送 RunLoop。我在这里闭嘴,因为我还在学习 CocoaTouch 和 SDK,我不想进一步混淆。