iOS运行循环机制有什么指南吗?

17

我正在学习iPhone上的套接字通信,它的指南提到了CFRunloop(这是一个CFNetwork指南,它可以在iOS上使用吗?) 在哪里可以学习有关iOS上的运行循环?API参考资料不足以解决问题。

3个回答

43

看一下苹果的 多线程编程指南 中的 "Run Loops" 章节。 简而言之:

  • 每个线程都有一个与之关联的运行循环(run loop)。
  • 如果要执行任何操作,必须运行运行循环。苹果的应用程序主函数会在主线程上为您处理这些事情。
  • 运行循环在特定模式下运行。 "公共模式" 实际上是一组模式,并且有一个 API 可以将模式添加到该集合中。
  • 运行循环的主要目的是监视计时器和运行循环源。每个源都向特定模式下的特定运行循环注册,并且仅在运行循环在该模式下运行时才在适当的时间检查它们。
  • 运行循环每次循环都要经历几个阶段,例如检查计时器和检查其他事件源。如果它发现任何源已准备好触发回调,则会触发相应的回调函数。
  • 除了使用现成的运行循环工具外,您还可以创建自己的运行循环源,以及注册运行循环观察器以跟踪运行循环的进度。

一个主要的陷阱是忘记在等待从运行循环源获取回调时运行运行循环。当您决定在主线程上繁忙地等待某些事情发生时,这有时会成为问题,但是当您创建自己的线程并向该线程注册运行循环源时,最有可能遇到此问题。对于非主线程,您需负责建立自动释放池并在必要时运行运行循环,因为应用程序主函数不会为您处理这些事情。

相对于使用运行循环机制,您最好阅读苹果的 并发编程指南,其中提供了运行循环机制的替代方案,例如操作队列和调度源。 "迁移到非线程" 章节的 "替换运行循环代码" 部分建议使用调度源而不是运行循环源来处理事件。


6

2
NSRunLoop是一种“事件驱动模式”(类似于Android中的Handler-Looper-MessageQueue和memcached等)。
我们使用`pipe()`函数生成两个文件描述符(一个用于读取,另一个用于写入)。在另一个线程中向写入文件描述符写入一些字节,就可以唤醒读取读取文件描述符的线程。
这个项目(由我发起)可以为您提供更多信息。

https://github.com/wuyunfeng/LightWeightRunLoop

我相信这个项目可以帮助你清晰、充分地理解 iOS/Mac 的 Runloop,从而能够正确、有效地使用 Runloop 设计你的项目。
希望这能对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接