首页 > 其他分享 >iOS之RunLoop - 前期准备:RunLoop运行逻辑

iOS之RunLoop - 前期准备:RunLoop运行逻辑

时间:2023-03-19 21:00:54浏览次数:38  
标签:Foundation 逻辑 CFRunLoopRef iOS NSRunLoop 线程 Mode RunLoop

什么是 RunLoop

1 - RunLoop 即运行循环:在程序运行中循环做一些事情

2 - RunLoop 应用范围

① 定时器(Timer)、PerformSelector

② GCD Async Main Queue

③ 事件响应、手势识别、界面刷新

④ 网络请求

⑤  AutoreleasePool

3 - RunLoop 基本作用

① 保持程序的持续运行

② 处理App中的各种事件(比如触摸事件、定时器事件等)

③ 节省 CPU 资源,提高程序性能:该做事时做事,该休息时休息

4 - iOS 中有 2 套 API 来访问和使用 RunLoop

① Foundation:NSRunLoop

② Core Foundation:CFRunLoopRef

注:NSRunLoop 和 CFRunLoopRef 都代表着 RunLoop 对象。NSRunLoop 是基于 CFRunLoopRef 的一层 OC 包装(CFRunLoopRef 是开源的)

      下载地址:https://opensource.apple.com/tarballs/CF/

5 - RunLoop 和线程的关系

① 每条线程都有唯一的一个与之对应的 RunLoop 对象

② RunLoop 保存在一个全局的 Dictionary 里(线程作为 key,RunLoop 作为 value)

③ 线程刚创建时并没有 RunLoop 对象,RunLoop 会在第一次获取它时创建

④ RunLoop 会在线程结束时销毁

⑤  主线程的 RunLoop 会自动获取(创建);子线程默认没有开启 RunLoop

6 - 如何获取 RunLoop 对象

1 // Foundation
2 [NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
3 [NSRunLoop mainRunLoop];    // 获得主线程的RunLoop对象
4 
5 // Core Foundation
6 CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象
7 CFRunLoopGetMain();     // 获得主线程的RunLoop对象

7 - Core Foundation 中关于 RunLoop 的五个类

① CFRunLoopModeRef 代表 RunLoop 的运行模式

② 一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个 Source0/Source1/Timer/Observer

③ RunLoop 启动时只能选择其中一个 Mode 作为 currentMode

④ 如果需要切换 Mode,只能退出当前 Loop 后再重新选择一个 Mode 进入

⑤ 不同 Mode 中的 Source0/Source1/Timer/Observer 能分隔开来,互不影响;如果 Mode 里没有任何 Source0/Source1/Timer/Observer,RunLoop 会立马退出

注:常见的 2 种 Mode

      kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个 Mode 下运行

      UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响

 RunLoop 的运行逻辑 <CF-CF-1153.18>

1 - 打开 CoreFoundation 源码,找到 CFRunnLoopRun 入口

2 - 源码不再一步步细读,直接上图:RunLoop 运行逻辑大致如下

具体流程图

 

标签:Foundation,逻辑,CFRunLoopRef,iOS,NSRunLoop,线程,Mode,RunLoop
From: https://www.cnblogs.com/self-epoch/p/17232640.html

相关文章

  • 06-逻辑仿真工具VCS-Debug
    逻辑仿真工具VCSverdi只进行debug进行使用,不进行编译,只进行产生波形之后的debug仿真速度和代码质量有关系,选项也会影响仿真速度,行为级>RTL>门级信号的可见性和......
  • 05-逻辑仿真工具VCS-详解01
    VerilogSimulationEventQueue主要了解VCS是如何处理交给它的代码的Verilog的仿真事件队列,介绍VCS如何处理交给它的代码。VCS是Synopsys公司的,支持多种语言。1.Verilo......
  • 【Lua】ToLua逻辑热更新
    1前言​Lua基础语法中系统介绍了Lua的语法体系,xLua逻辑热更新中介绍了xLua的应用,本文将进一步介绍Unity3D中基于ToLua实现逻辑热更新。​逻辑热更新......
  • 【Lua】xLua逻辑热更新
    1前言​Lua基础语法中系统介绍了Lua的语法体系,ToLua逻辑热更新中介绍了ToLua的应用,本文将进一步介绍Unity3D中基于xLua实现逻辑热更新。​逻辑热更新......
  • 使用vue2+element-ui+axios实现后台管理系统的增删改查
    以下仅作为自己个人学习使用前言:需要后端的接口已经在另外一篇博客写了,需要的小伙伴们可以去那边参考,下面是链接https://www.cnblogs.com/Amyel/p/17233060.html正片......
  • 白盒测试之逻辑覆盖
    PS:课程笔记(里面有余九九课本里的举例)首先,逻辑覆盖是一种基于程序内部逻辑结构的动态白盒测试方法;其次,根据逻辑覆盖的强度由低到高可以分为语句覆盖、判定覆盖、条件......
  • 安装axios和二次封装
    [email protected] 二次封装:项目中新建api目录,及request.js//对于axios进行二次封测importaxiosfrom'axios';//1.利用axios读写的方法create,创......
  • 逻辑运算符短路特性
    &&短路特性遇到假即为假,不会判断下一组表达式||短路特性遇到真即为真,不会判断下一组表达式......
  • Vue3 + go + axios 的前后端交互
    下载npminstallaxiosaxios全局配置创建一个js文件用于保存axios设置,配置文件自行搜索在main.js中使用保存好的axios设置```jsimportaxiosfrom'@/plugins/axi......
  • axios
    axiosaxios可以局部导入和全局导入首先要下载axios插件全局导入当把axios挂载到mainjs中,就是全局了,在其他的组件中就不需要再导入了①main.js导入axiosimportaxios......