iOS知识点---Runloop

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.mzph.cn/news/824313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker一键快速私有化部署(Ollama+Openwebui) +AI大模型(gemma,llama2,qwen)20240417更新

几行命令教你私有化部署自己的AI大模型,每个人都可以有自己的GTP 第一步:安装Docker(如果已经有了可以直接跳第二步) ####下载安装Docker wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo##…

STM32 USB虚拟串口

电路原理图 usb部分 晶振部分 usb与单片机连接 配置信息 sys配置信息 rcc配置信息 usb配置信息 虚拟串口配置信息 时钟配置信息 项目配置信息 代码 包含文件 主函数代码 实验效果 修改接收波特率依然可以正常接收,也就是说单片机可以自动适应上位机的波特率设置。…

4.17作业

#include "double_link_list.h" node_p create_double_link_list() //创建双向链表 {node_p H(node_p)malloc(sizeof(node));if(HNULL){printf("空间申请失败\n");return NULL;}H->data0;H->priNULL;H->nextNULL;return H; } node_p create_node…

【S32K3 MCAL配置】-6.1-ICU Driver:WKPU外设让MCU芯片从“Low Power Mode低功耗模式”中WakeUp唤醒

"><--返回「Autosar_MCAL高阶配置」专栏主页--> 案例背景:此博文适用于“MCU芯片处在常电”工作(MCU的5V/3.3V供电一直存在)的项目当中。另外S32K3仅有RUN模式和STANDBY模式,MCU进入“Low Power Mode低功耗模式”(STANDBY模式)后,可通过WKPU Pin唤醒MCU芯片…

MapReduce分区机制(Hadoop)

在MapReduce中&#xff0c;分区&#xff08;Partitioning&#xff09;是将Map阶段输出的键值对根据某种规则分发到不同的Reduce任务上的过程。这个过程非常关键&#xff0c;因为它直接影响到了Reduce阶段的负载均衡和性能。 1. 哈希分区&#xff08;Hash Partitioning&#xf…

封装react-antd-table组件参数以及方法如rowSelection、pageNum、pageSize、分页方法等等

一般情况下&#xff0c;我们在页面组件里面都会使用state创建对应的分页参数和分页方法然后传入对应的组件内部&#xff0c;再或者选择行、全选等等&#xff0c;这都会在每一个组件中徒增大量的代码行数&#xff0c;所以简单整理了一下这个只是针对于处理逻辑的组件&#xff1a…

BUUCTF——[GXYCTF2019]BabyUpload

BUUCTF——[GXYCTF2019]BabyUpload 1.上传嘛&#xff0c;直接丢正常的jpg文件进服务器 2.发现可以正常上传&#xff0c;并且回显出来啦文件上传的路径 /var/www/html/upload/7df22610744ec51e9cb7a8a8eb674374/1111.jpg 3.尝试上传一句话木马 <?php eval($POST[123456]…

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…

Python机器学习项目开发实战:深度神经网络

注意&#xff1a;本文提供下载的教程&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 在Python中开发一个基于深度神经网络的机器学习项目&#xff0c;可以涉及到许多不同的步骤和技术。以下是一个简化…

「 网络安全常用术语解读 」漏洞利用交换VEX详解

漏洞利用交换&#xff08;Vulnerability Exploitability eXchange&#xff0c;简称VEX&#xff09;是一个信息安全领域的标准&#xff0c;旨在提供关于软件漏洞及其潜在利用的实时信息。根据美国政府发布的用例(PDF)&#xff0c;由美国政府开发的漏洞利用交换(VEX)使供应商和用…

[ LeetCode ] 题刷刷(Python)-第26题:删除有序数组中的重复项

题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &…

工业电脑在ESOP工作站行业应用

ESOP工作站行业应用 项目背景 E-SOP是实现作业指导书电子化&#xff0c;并统一管理和集中控制的一套管理信息平台。信迈科技的ESOP终端是一款体积小巧功能齐全的高性价比工业电脑&#xff0c;上层通过网络与MES系统连接&#xff0c;下层连接显示器展示作业指导书。ESOP控制终…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.5版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、小程序、Uniapp、标准Java平台&#xff0c;服务端基于Netty编写。 工…

MAC 终端命令

Command Shift . 显示隐藏文件夹 环境变量路径 ~/.zshrc ~/.bash_profile 每次打开都需要 source 安装Homebrew xcode安装 xcode-select --install brew安装 /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)” 检查是否…

朗思-我的家园正式上线:朗思科技Agent工具软件--人人拥有“Ai-机器人”

4月16日&#xff0c;朗思科技正式发布"朗思-我的家园"。朗思科技是国内领先的Ai Agent智能自动化工具软件产品及方案的提供商&#xff0c;始终坚持自主研发&#xff0c;全面支持国产信创&#xff0c;不断加快产品创新迭代。基于技术领先性和战略前瞻性&#xff0c;其…

【小白学机器学习13】一文理解假设检验的反证法,H0如何设计的,什么时候用左侧检验和右侧检验,等各种关于假设检验的基础知识

目录 前言&#xff1a; 目标 1 什么叫 假设检验 1.1 假设检验的定义 1.1.1 来自百度百科 1.1.2 维基百科 1.2 假设检验的最底层逻辑&#xff1a;是反证法思想 1.3 假设检验的底层构造&#xff1a;小概率反证法思想 2 什么叫反证法 2.1 反证法的概念 2.1.1 来自百度…

ES解构的使用

文章目录 1 概念2 数组解构3 对象结构 1 概念 解构是ES6中引入的一个新语法特性&#xff0c;它是一种按照一定模式从数组或对象中提取值&#xff0c;对变量进行赋值的行为。解构可以被视为一种结构化赋值方法&#xff0c;用于简化从数据结构&#xff08;如数组或对象&#xff…

MFC下CPictureCtrl控件基于鼠标左键坐标的直线绘图

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 目录 1.创建自定义类CMyPictureCtrl 2.布局Dlg 3.实验代码 4.运行结果 在基于对话框的MFC应用程序中&#xff0c;通过鼠标操作获取坐标并在CPictureCtrl控件中使用Lin…

【软件测试】单元测试+集成测试+系统测试

以下是来自“文心一言”搜索的回答 单元测试 单元测试是软件开发中的一种测试方法&#xff0c;用于对软件中的最小可测试单元进行测试。这些最小单元通常是函数、方法或类等代码片段。单元测试的目的是验证每个单元的代码是否按预期工作&#xff0c;确保其功能正确&#xff0…

极化码的编码

引言 极化码是一种比较特殊的线性分组码,同时其还是一种信道专属编码,在极化码的编码构造方案中,每种不同的信道都有属于自己特定的编码构造方式,而当给定一种具体的信道环境时,极化码的构造方案还是与其他的线性分组码比较的类似,极化码的编码码字也是通过信息序列乘以生…