15

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

4

3 回答 3

41

查看Apple线程编程指南的“运行循环”一章。简单来说:

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

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

您最好阅读 Apple 的并发编程指南,其中建议了 runloop 机制的替代方案,例如操作队列和调度源。“从线程迁移”一章的“替换运行循环代码”部分建议使用调度源而不是运行循环源来处理事件。

于 2011-06-02T15:32:50.783 回答
6

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

主事件循环

运行循环

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

SimpleURLConnections(虽然这个使用了 NSURLConnection API)

于 2011-06-02T15:40:07.660 回答
2

NSRunLoop 是一个Event-Driven-Mode(androidHandler-Looper-MessageQueuememcached

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

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

https://github.com/wuyunfeng/LightWeightRunLoop

我相信这个项目可以帮助你清晰、充分地理解iOS/Mas Runloop,让你可以正确有效地使用runloop来设计你的项目。

希望这可以帮到你。

于 2016-08-28T14:18:42.073 回答