iOS runloop机制有什么指南吗?

时间:2011-06-02 15:27:15

标签: iphone ios sockets runloop

我正在学习iPhone上的套接字通信,它的指南说了CFRunloop(它是CFNetwork的指南,可以在iOS上使用吗?) 我在哪里可以了解iOS上的runloop?API参考是不够的。

3 个答案:

答案 0 :(得分:37)

查看Apple的线程编程指南的"Run Loops" chapter简而言之:

  • 每个线程都有一个运行循环。
  • 必须运行run循环才能执行任何操作。 Apple的应用程序主要功能在主线程上为您处理。
  • 运行循环以特定模式运行。 “共模”实际上是一组模式,并且有一个用于向该组添加模式的API。
  • 运行循环的主要目的是监视计时器并运行循环源。每个源都使用特定模式的特定运行循环进行注册,并且仅在runloop以该模式运行时的适当时间进行检查。
  • 运行循环在每个循环中经历几个阶段,例如检查计时器和检查其他事件源。如果发现任何源已准备好触发,则会触发相应的回调。
  • 除了使用现成的运行循环工具之外,您还可以创建自己的运行循环源以及注册运行循环观察器以跟踪运行循环的进度。

一个主要的缺陷是在等待来自runloop源的回调时忘记运行run循环。当您决定忙于等待主线程上发生的事情时,这有时会出现问题,但是当您创建自己的线程并使用该runloop注册runloop源时,您最有可能遇到此问题。您负责建立自动释放池并在非主线程上运行runloop(如果需要),因为应用程序主函数不会为您执行此操作。

你会更好地阅读Apple的Concurrency Programming Guide,这表明了runloop机制的替代方案,例如操作队列和调度源。 “迁移远离线程”一章的“替换运行循环代码”部分建议使用调度源而不是runloop源来处理事件。

答案 1 :(得分:5)

在Apple文档中查看这些文章:

Main event loop

Run Loops

有关如何通过运行循环运行异步连接的示例代码:

SimpleURLConnections(虽然这个使用NSURLConnection API)

答案 2 :(得分:1)

NSRunLoop是Event-Driven-Mode(android Handler-Looper-MessageQueuememcached等)

  

我们使用pipe()生成两个fd(一个用于read,另一个用于write)。我们可以通过在其他线程中向read fd写一些字节来唤醒线程(谁读取write fd)。

这个项目(由我赞助)可以为您提供更多信息。

  

https://github.com/wuyunfeng/LightWeightRunLoop

我相信这个项目可以帮助您清楚和充分地理解iOS / Mas Runloop,因此您可以正确有效地使用runloop来设计项目。

希望这可以帮到你。