首页 > 其他分享 >iOS - Runloop的运行逻辑

iOS - Runloop的运行逻辑

时间:2024-03-31 09:31:59浏览次数:11  
标签:逻辑 处理 通知 iOS Observers 休眠 Source1 Runloop

文章目录

iOS - Runloop的运行逻辑

1. 苹果官方的Runloop执行图

2. Mode里面的东西

2.1 Source0

  • 触摸事件处理
  • performSelector:onThread:

2.2 Source1

  • 基于Port的线程间通信
  • 系统事件捕捉

系统事件捕捉:从用户点击屏幕到应用处理触摸事件,先是由Source1捕捉屏幕点击事件(系统事件),然后再包装成Source0处理触摸事件

2.3 Timers

  • NSTimer
  • performSelector:withObject:afterDelay:

2.4 Observers

  • 用于监听RunLoop的状态
  • UI刷新(BeforeWaiting)
  • Autorelease pool(BeforeWaiting)

UI刷新和Autorelease pool清理自动释放对象,都是在Runloop即将进入睡眠状态时触发(kCFRunLoopBeforeWaiting)

3. 执行流程

  1. 通知Observers:进入Loop
  2. 通知Observers:即将处理Timers
  3. 通知Observers:即将处理Sources
  4. 处理Blocks
  5. 处理Source0(可能会再次处理Blocks)
  6. 如果存在Source1,就跳转到第8步
  7. 通知Observers:开始休眠(等待消息唤醒)
  8. 通知Observers:结束休眠(被某个消息唤醒)
    1. 处理Timer
    1. 处理GCD Async To Main Queue
    1. 处理Source1
  1. 处理Blocks
  2. 根据前面的执行结果,决定如何操作
    1. 回到第02步
    1. 退出Loop
  1. 通知Observers:退出Loop

3.1 注意点

GCD很多东西不依赖于Runloop,它们是分开的。但是GCD子线程回到主线程的时候,是依赖于Runloop的

dispatch_async(dispatch_get_main_queue(), ^{
    NSLog(@"");
});

4. Runloop休眠

Runloop休眠,是通过系统内核API,不同于while循环那种,而是真正地进入休眠状态

@oubijiexi

标签:逻辑,处理,通知,iOS,Observers,休眠,Source1,Runloop
From: https://blog.csdn.net/sharp521/article/details/137158601

相关文章

  • Vue3+Vite+Axios Request 请求封装(TS版本)最新
    Vue3+Vite+AxiosRequest请求封装(TS版本)http>index.ts请求封装/**@Date:2024-03-3012:37:05*@LastEditors:zhong*@LastEditTime:2024-03-3014:12:52*@FilePath:\app-admin\src\http\index.ts*/importaxios,{AxiosInstance,AxiosRequestCon......
  • day01-字符串方法-逻辑运算符规律
    字符串方法 查询类方法 字符串.index(字符):查询指定字符在整个字符串中第一次出现的位置下标;如果下表不存在则报错字符串.find(字符):查询指定字符在整个字符串中第一次出现的位置下标;如果下表不存在则返回-1字符串.rindex(字符):查询指定字符在整个字符串中最后一次出现的......
  • openGauss 逻辑复制
    逻辑复制可获得性本特性自openGauss1.0.0版本开始引入。特性简介openGauss提供逻辑解码功能,将物理日志反解析为逻辑日志。通过DRS等逻辑复制工具将逻辑日志转化为SQL语句,到对端数据库回放,达到异构数据库同步数据的功能。目前支持openGauss数据库与MySQL数据库、Oracle数据库......
  • Ansible获取Cisco IOS版本导出至CSV
    1.inventory和密码加密参考AnsiblePlaybook备份Juniper及Cisco设备2.创建playbook-name:getciscoswitchesversionhosts:cisco_switchesgather_facts:falsevars_files:-pass.ymlvars:ansible_password:'{{cisco_pass}}'output_path:&qu......
  • KingbaseES 普通用户逻辑导入时权限不足错误
    逻辑导入时权限报错:ERROR:mustbememberofrole"system"实验:1、在超级用户system下新建用户与schema:createuseruser1;createschemas1;修改user1的默认权限:test=#alterdefaultprivilegesinschemas1grantallontablestouser1;ALTERDEFAULTPRIVILEGESt......
  • nbtstat /?命令参数 显示使用NBT(NetBIOS over TCP/IP)的协议统计信息和当前TCP/IP连接
    NBTSTAT(NetBIOSoverTCP/IPStatistics)是一个用于显示和更新NetBIOS名称缓存、NetBIOS名称表和NetBIOS会话表的Windows命令行实用程序。它允许用户查看当前网络上的NetBIOS名称信息,以便诊断网络连接问题和执行基本的网络故障排除。NetBIOS是一种用于在局域网中进行通信的协议,它......
  • ios使用openlayer地图缩放时卡顿
    问题描述h5项目使用openlayer展示地图,并且使用VectorLayer铺点,安卓完全没问题,但是ios上缩放后会突然触发无法缩放并且无法点击拖动缓慢等问题。经排查,是VectorLayer的minZoommaxZoom导致,但不理解原因。问题代码如下importVectorLayerfrom'ol/layer/Vector'vectorLayer......
  • 逻辑回归中交叉熵损失函数的梯度
    要给出逻辑回归中交叉熵损失函数最小化的梯度推导过程,我们首先定义损失函数和模型预测的形式。对于二分类逻辑回归,模型预测使用sigmoid函数,即:\[\hat{y}_i=\sigma(z_i)=\frac{1}{1+e^{-z_i}}\]其中,\(z_i=X_i\cdot\theta\)是模型对第\(i\)个样本的线性预测,\(X_i\)是样本......
  • 【全开源】JAVA游戏陪玩系统源码陪练APP源码H5源码电竞系统源码支持Android+IOS+H5_博
    “游戏陪玩系统源码、陪练APP源码、H5源码及电竞系统源码”,这些创新技术的融合,为电竞爱好者与游戏玩家带来前所未有的互动体验。通过我们的源码,您可以轻松搭建起一个功能完备的游戏陪玩平台,无论是寻找技术高超的陪练,还是与志同道合的玩家组队竞技,都能在这个平台上得到满足。同......
  • 【全开源】JAVA多商户运营版商城系统源码地摊兄源码多商户源码社交电商源码支持Androi
    "多商户运营版商城系统源码——地摊兄源码多商户源码社交电商源码",是现今电商领域的一大突破。此源码设计独特,功能全面,既满足了多商户运营的需求,又融入了社交电商的理念。通过这套源码,商家可以轻松搭建起一个功能强大的电商平台,实现多商户的集中管理与运营,提升整体运营效率和用......