我正在iPhone上学习套接字通信,它的指南介绍了CFRunloop
(这是CFNetwork
的指南,可以在iOS上使用吗?)在哪里可以了解iOS上的runloop?API引用不够。
查看Apple的线程编程指南中的"运行循环"一章简而言之:
- 每个线程都有一个运行循环
- 必须运行run循环才能执行任何操作。苹果的应用程序主功能在主线程上为您处理这一问题
- 运行循环在特定模式下运行。"公共模式"实际上是一组模式,并且有一个API用于向该组模式添加模式
- 运行循环的主要用途是监视计时器和运行循环源。每个源都注册到特定模式的特定运行循环中,并且只有在运行循环以该模式运行时才会进行检查
- 运行循环在每个循环中经历几个阶段,例如检查计时器和检查其他事件源。如果它发现任何源都已准备好启动,就会触发相应的回调
- 除了使用现成的运行循环工具外,您还可以创建自己的运行循环源,以及注册运行循环观察器来跟踪运行循环的进度
一个主要的陷阱是在等待来自运行循环源的回调时忘记了运行运行循环。当你决定忙于等待主线程上发生的事情时,这有时会是一个问题,但当你创建自己的线程并向该运行循环注册运行循环源时,你很可能会遇到这个问题。您负责建立一个自动释放池,并在需要时在非主线程上运行运行循环,因为应用程序主函数不会为您执行此操作。
您最好阅读Apple的并发编程指南,该指南建议了运行循环机制的替代方案,如操作队列和调度源。"从线程迁移"一章的"替换运行循环代码"部分建议使用调度源而不是运行循环源来处理事件。
看看Apple文档中的这些文章:
主事件循环
运行循环
有关如何通过运行循环运行异步连接的示例代码:
SimpleURLConnection(尽管此连接使用NSURLConnection API)
NSRunLoop是一个Event-Driven-Mode
(android Handler-Looper-MessageQueue
和memcached
等)
我们使用
pipe()
来生成两个fd(一个用于read
,另一个用于write
)。我们可以通过向其他线程中的write
fd写入一些字节来唤醒线程(读取read
fd的线程)。
这个项目(由我赞助)可以给你更多的信息。
https://github.com/wuyunfeng/LightWeightRunLoop
我相信这个项目可以帮助你清楚、充分地理解iOS/Mas Runloop,这样你就可以正确、有效地使用Runloop来设计你的项目。
希望这能帮助到你。