ios - RunLoop 如何减少 CPU 周期

标签 ios objective-c nsrunloop

几天来,我一直在 Apple 文档和 Google 搜索中阅读有关 RunLoops 的内容。我已经在很大程度上理解了 RunLoops 的概念,但对于有关 RunLoops 的一些基本问题,我仍然没有答案。

  1. Runloop 究竟是如何工作的?它是否类似于在某些系统级别运行的 while 循环?
  2. 如果它确实是某种系统级别的 while 循环,那么它与轮询有何不同?

请为此提供一些建议..

最佳答案

关于 RunLoop(在其他平台上被称为窗口处理程序、主循环、事件循环)的全部意义在于它促进了事件驱动架构,其中应用程序仅在出现时运行是要做的事情——例如,响应用户交互。这与轮询相反。

该架构的基础是某种消息队列,线程可以阻塞该消息队列,直到有消息可供处理为止。在 MacOSX 和 iOS 系统上,队列是 Mach kernel RPC 端口。在 Windows 上,它是一个内核 IPC 队列,在 X-windows 系统上,它是一个 unix 域或网络套接字。

事件由其他系统组件插入到队列中 - 例如窗口管理器和其他应用程序。应用程序从其他线程向自己发送消息以便在同一线程中执行所有 UI 处理也很常见。

运行循环本身驻留在应用程序空间中,看起来像这样:

while (!stop)
{
    message = WaitForNextMessage();
    DispatchMessage(message);
}

通常,无论您使用什么 UI 框架,都会提供一种机制来为特定类型的事件注册事件处理程序。

关于ios - RunLoop 如何减少 CPU 周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18288544/

相关文章:

ios - 修补应用内购买黑客;卡在第四步

ios - 在我决定停止它之前,将当前线程 NSRunLoop 设置为以某种模式运行的正确方法是什么?

objective-c - 关于 NSRunLoop,需要澄清

ios - Objective-C中另一个线程中的计时器

android - flutter ,打开键盘时如何无缝 ScrollView

ios - 多个动画 block 不起作用

ios - @property 声明和大括号声明

iphone - UIView 和 UITableView 中的 UITapGestureRecognizer 冲突

objective-c - AppleEvents:收到 mach 消息,它不是 getMemoryReference 中预期的复杂类型

ios - 选择选择器选项后,为什么我的 SwiftUI 页面标题会发生变化?