iOS知识点---Runloop

ops/2024/11/15 6:16:29/

iOS 中的 Runloop 机制是一种事件驱动模型,用于管理和调度线程上的事件,确保线程在有工作要做时保持活跃,无事可做时进入休眠状态以节省系统资源。以下是 Runloop 机制的关键组成部分及其工作原理:

关键组成部分与原理:

  1. 事件循环:Runloop 本质上是一个无限循环,其内部不断检查是否有待处理的事件,并在有事件时执行相应的处理逻辑。如果没有事件,则让线程进入休眠状态,直到下一次事件到来唤醒线程。

  2. 线程绑定:每个线程都有自己的 Runloop 实例,且 Runloop 与线程是一一对应的关系。主线程的 Runloop 在应用启动时自动创建并运行,非主线程则需要手动创建和启动 Runloop。

  3. 事件源

    • Input Sources:用于接收外部异步事件,如触摸事件、网络请求、端口消息等。分为基于端口的(如 Mach 端口)和自定义的 GCD Source,它们可以触发 Runloop 从休眠状态中唤醒。

    • Timer Sources:用于安排定时任务,如 NSTimer。当设定的触发时间到达时,Timer Source 会向 Runloop 注册一个事件,使其在下一次循环中执行相应的回调。

  4. 运行模式(Modes):Runloop 支持多个运行模式,如 kCFRunLoopDefaultMode(默认模式)、UITrackingRunLoopMode(滑动手势模式)、NSModalPanelRunLoopMode(模态对话框模式)等。每个模式关联一组事件源,切换模式会改变当前处理事件的范围。

  5. 观察者(Observers):允许在 Runloop 的特定阶段(如即将进入、正在运行、即将退出循环等)注册观察者回调,用于监控 Runloop 的状态变化、执行自定义操作或调整 Runloop 行为。

在项目中的使用场景:

  1. UI 更新与事件响应:主线程的 Runloop 负责处理所有与用户界面相关的事件,如触摸事件、屏幕更新、手势识别等。保持主线程 Runloop 的运行是保持应用流畅性和响应性的基础。

  2. 定时任务:通过配置 Timer Sources,可以实现定时任务的执行,如动画帧刷新、定时数据刷新、定时提醒等。例如,使用 NSTimer 创建定时器,其背后依赖的就是 Runloop。

  3. 网络通信与长连接:在 socket 编程中,Runloop 与端口输入源配合,能够高效地处理网络连接的读写事件,实现实时的数据通信和服务器心跳保持。

  4. 线程保活与资源优化:对于需要长期运行但并非持续工作的后台线程,通过启动 Runloop 并设置合适的事件源(如空的 Mach 端口),可以在无任务时使线程休眠,降低 CPU 占用率,有事件时迅速唤醒处理。

  5. 滑动过程中定时器管理:在滑动视图时,Runloop 会切换到 UITrackingRunLoopMode,此时默认模式下的定时器会暂停。若需滑动期间定时器继续工作,可以将其配置为 common 模式(包含 default 和 tracking 模式),确保在不同模式下都能响应。

  6. 异步回调处理:在辅助线程中,通过启动 Runloop 可以等待并处理自定义的异步回调,如文件读写、数据解析完成后通知主线程更新界面。

  7. Crash 收集与应用恢复:一些 Crash 收集 SDK 可能利用 Runloop 来监控应用状态,当检测到异常即将导致应用崩溃时,通过 Runloop 来尝试捕获异常、收集信息,并尝试恢复应用运行。

总结来说,iOS 中的 Runloop 机制是线程管理和事件处理的核心基础设施,它在众多场景中发挥着关键作用,帮助开发者构建高性能、高响应性的应用程序。无论是 Objective-C 还是 Swift 开发项目,理解和合理运用 Runloop 都对提升应用的整体表现至关重要。


http://www.ppmy.cn/ops/6845.html

相关文章

什么是线程?线程和进程谁更弔?

第一个参数是所创建进程的pid。 第二个是线程的属性。 第三个参数是返回值为void*&#xff0c;参数也为void*的函数指针。 第四个参数是给第三个参数的参数&#xff0c;也就是给给函数传参。 #include<iostream> #include<pthread.h> #include<unistd.h>…

《剑指 Offer》专项突破版 - 面试题 111 : 计算除法(C++ 实现)

题目链接&#xff1a;计算除法 题目&#xff1a; 输入两个数组 equations 和 values&#xff0c;其中&#xff0c;数组 equations 的每个元素包含两个表示变量名的字符串&#xff0c;数组 values 的每个元素是一个浮点数值。如果 equations[i] 的两个变量名分别是 和 &#…

ASP.NET基于TCP协议的简单即时通信软件的设计与实现

摘 要 即时通信(Instant Message)&#xff0c;由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用。设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。即时通信的底层通信是通过SOCKET套接字接口实现的。当前的主流UNIX系统和微…

CoFSM基于共现尺度空间的多模态遥感图像匹配方法--论文阅读记录

目录 论文 Multi-Modal Remote Sensing Image Matching Considering Co-Occurrence Filter 参考论文&#xff1a;SIFT系列论文&#xff0c; SIFT Distinctive Image Features from Scale-Invariant Keypoints&#xff0c;作者&#xff1a;David G. Lowe 快速样本共识算法…

23.组件注册方式

组件注册方式 一个 Vue 组件在使用前需要先被“注册”&#xff0c;这样 Vue 才能在渲染模板时找到其对应的实现。组件注册有两种方式&#xff1a;全局注册和局部注册 全局注册 import { createApp } from vue import App from ./App.vue import GlobalComponent from ".…

PyTorch小技巧:使用Hook可视化网络层激活(各层输出)

这篇文章将演示如何可视化PyTorch激活层。可视化激活&#xff0c;即模型内各层的输出&#xff0c;对于理解深度神经网络如何处理视觉信息至关重要&#xff0c;这有助于诊断模型行为并激发改进。 我们先安装必要的库: pip install torch torchvision matplotlib加载CIFAR-10数据…

CGLIB动态代理

文章目录 前言概要SpringBoot中使用小结 前言 当我们需要在Java中实现动态代理时&#xff0c;通常会考虑使用 JDK原生动态代理 或者 CGLIB动态代理。 我这里说一下CGLIB动态代理&#xff0c;并给出一个例子。 概要 CGLIB&#xff08;Code Generation Library&#xff09;是一…

SpringBoot3 + Kotlin + mybatis-plus + Swagger3后端开发样例

前言&#xff1a; Kotlin 是一种在 JVM&#xff08;Java 虚拟机&#xff09;、Android 和浏览器端运行的静态类型编程语言。以下是关于 Kotlin 的总结介绍&#xff1a; 1、语言特性&#xff1a; 简洁性&#xff1a;Kotlin 旨在提供简洁且安全的代码&#xff0c;同时保持与 Jav…