iOS - Runloop介绍

文章目录

  • iOS - Runloop介绍
    • 1. 简介
      • 1.1 顾名思义
      • 1.2. 应用范畴
      • 1.3. 如果没有runloop
      • 1.4. 如果有了runloop
    • 2. Runloop对象
    • 3. Runloop与线程
    • 4. 获取Runloop对象
      • 4.1 Foundation
      • 4.2 Core Foundation
      • 4.3 示例
    • 5. Runloop相关的类
      • 5.1 Core Foundation中关于RunLoop的5个类
      • 5.2 CFRunLoopRef
      • 5.3 CFRunLoopModeRef
      • 5.4 相关的类之间的关系
        • 5.4.1 CFRunLoopModeRef
          • 5.4.1.1常见的2种Mode
      • 5.5 Runloop状态
        • 5.5.1 监听Runloop状态

iOS - Runloop介绍

1. 简介

1.1 顾名思义

  • 运行循环
  • 在程序运行过程中循环做一些事情

1.2. 应用范畴

  • 定时器(Timer)、PerformSelector
  • GCD Async Main Queue
  • 事件响应、手势识别、界面刷新
  • 网络请求
  • AutoreleasePool

1.3. 如果没有runloop


执行完第13行代码后,会即将退出程序

1.4. 如果有了runloop

  • 程序并不会马上退出,而是保持运行状态
  • RunLoop的基本作用
    1. 保持程序的持续运行
    2. 处理App中的各种事件(比如触摸事件、定时器事件等)
    3. 节省CPU资源,提高程序性能:该做事时做事,该休息时休息

2. Runloop对象

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

    1. Foundation:NSRunLoop

    2. Core Foundation:CFRunLoopRef

  • NSRunLoopCFRunLoopRef都代表着RunLoop对象

    1. NSRunLoop是基于CFRunLoopRef的一层OC包装
    2. CFRunLoopRef是开源的

https://opensource.apple.com/tarballs/CF/

3. Runloop与线程

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

  • RunLoop保存在一个全局的Dictionary里,线程作为keyRunLoop作为value

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

  • RunLoop会在线程结束销毁

  • 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop

4. 获取Runloop对象

4.1 Foundation

  • [NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
  • [NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象

4.2 Core Foundation

  • CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象`
  • CFRunLoopGetMain(); // 获得主线程的RunLoop对象

4.3 示例

5. Runloop相关的类

5.1 Core Foundation中关于RunLoop的5个类

  1. CFRunLoopRef
  2. CFRunLoopModeRef
  3. CFRunLoopSourceRef
  4. CFRunLoopTimerRef
  5. CFRunLoopObserverRef

5.2 CFRunLoopRef

  • _modes里面装了多个CFRunLoopModeRef对象,其中只有一个mode作为_currentMode

5.3 CFRunLoopModeRef

5.4 相关的类之间的关系

  • CFRunLoopRef里面装了多个CFRunLoopModeRef对象
  • CFRunLoopModeRef对象里面装的是CFRunLoopSourceRefCFRunLoopTimerRefCFRunLoopObserverRef
5.4.1 CFRunLoopModeRef
  • CFRunLoopModeRef代表RunLoop的运行模式

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

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

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

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

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

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

5.5 Runloop状态

5.5.1 监听Runloop状态
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {switch (activity) {case kCFRunLoopEntry: {NSLog(@"kCFRunLoopEntry");}break;case kCFRunLoopBeforeTimers: {NSLog(@"kCFRunLoopBeforeTimers");}break;case kCFRunLoopBeforeSources: {NSLog(@"kCFRunLoopBeforeSources");}break;case kCFRunLoopBeforeWaiting: {NSLog(@"kCFRunLoopBeforeWaiting");}break;case kCFRunLoopAfterWaiting: {NSLog(@"kCFRunLoopAfterWaiting");}break;case kCFRunLoopExit: {NSLog(@"kCFRunLoopExit");}break;;default:break;}
});
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopCommonModes);
CFRelease(observer);

触发一次点击事件:

@oubijiexi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780449.shtml

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

相关文章

java复原IP 地址(力扣Leetcode93)

复原IP 地址 力扣原题链接 问题描述 有效 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.168.1.1” 是有效 IP 地址&#xff0c…

【CASS精品教程】CASS11台阶画法大全

文章目录 一、无边台阶二、有边台阶三、圆弧无边台阶四、U型台阶五、曲线U型台阶六、L型台阶一、无边台阶 点击【居民地】→【房屋附属】→【台阶】: 选择【两点边】即可。 两点边的绘制方法是,依次点击四个点,或者点击三个点后空格,注意台阶缺口(有白色线条)为下。 四…

开发DDD伪创新工具-UMLChina建模知识竞赛第5赛季第7轮(无人答对,再换题重发)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题,即可获得本轮优胜。 如果有第4题,第4题为附加题&am…

大数据-hive,初步了解

1. Hive是什么 Hive是基于Hadoop的数据仓库解决方案。由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性,因此使用Hive构建的数据仓库也秉承了这些特性。 简单来说,Hive就是在Hadoop上架了一层SQL接口,可以将SQL翻译成MapRedu…

hcia datacom课程学习(5):MAC地址与arp协议

1.MAC地址 1.1 含义与作用 (1)含义: mac地址也称物理地址,是网卡设备在数据链路层的地址,全世界每一块网卡的mac地址都是唯一的,出厂时烧录在网卡上不可更改 (2)作用&#xff1a…

【项目技术介绍篇】若依开源项目RuoYi-Cloud后端技术介绍

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

图解CAP原理

CAP原理 通常说一个分布式系统或者服务或者中间件,不能同时拥有这三个特性。它们只能两两组合。 分区容错性 尽管一个系统出现了数据的丢失或者故障,那么我们的系统仍然要对外提供正常的访问 如上图所示,一个结点挂掉不影响另一个结点对外提供…

旅游管理系统|基于springBoot旅游管理系统设计与实现(附项目源码+论文)

基于springBoot旅游管理系统设计与实现 一、摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助…

每天五分钟卷积神经网络:如何基于滑动窗口技术完成目标的检测?

汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…

Java 学习和实践笔记(50):使用Comparable 接口确定对象根据什么属性来排序

多个对象进行排序时,需要根据对象的什么属性来排序。 例如,同样都是人,可以根据人的身高排序,可以根据人的年龄排序。因此,当对多个人进行排序时,就要事先确定好根据人的什么属性来排序。 使Comparable 接…

【物联网项目】基于ESP8266的家庭灯光与火情智能监测系统——文末完整工程资料源码

目录 系统介绍 硬件配置 硬件连接图 系统分析与总体设计 系统硬件设计 ESP8266 WIFI开发板 人体红外传感器模块 光敏电阻传感器模块 火焰传感器模块 可燃气体传感器模块 温湿度传感器模块 OLED显示屏模块 系统软件设计 温湿度检测模块 报警模块 OLED显示模块 …

Java基础之自增自减运算符

Java基础之自增自减运算符 基本用法 int a 10;a; System .out.prinln(a);//a11int a 10;a; System .out.prinln(a);//a11tip: 第一次运算之后a的值会更新 然后再进行下面的运算!!! 练习: 代码呈现: 结果: tip: x的值是最新的x的值.

微信小程序开发【从入门到精通】——页面导航

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

el-select的错误提示不生效、el-select验证失灵、el-select的blur规则失灵

发现问题 在使用el-select进行表单验证的时候&#xff0c;发现点击下拉列表没选的情况下&#xff0c;他不会提示没有选择选项的信息&#xff0c;我设置了rule如下 <!--el-select--><el-form-item label"等级" prop"level"><el-select v-m…

Y Combinator W24 AI 创业地图

近日公布&#xff0c;Y Combinator的W24 AI创业地图上&#xff0c;有149家公司专注于AI领域&#xff0c;占到了总数的63%哦&#xff01; 而且&#xff0c;这些公司中&#xff0c;有70%是在应用层发力&#xff0c;28%则专注于工具层&#xff0c;只有2%是搞基础设施的。 分类百分…

esp单片机下arduino_gfx不相干显示驱动优化对flash空间的占用对比

一般情况下&#xff0c;很多esp32或者esp8266下的tft模块驱动都会包含很多种&#xff0c;而我们只需要其中一种&#xff0c;那就有个疑问这些被编译进的显示驱动到底占用了多少空间&#xff0c;是否需要把他优化掉&#xff1f; 这是默认的驱动列表&#xff1a; 84个文件&…

对谈Concured首席技术官:利用AI和MongoDB打造个性化内容推荐系统

Built with MongoDB 栏目采访了AI初创企业Concured在成立约一年后加入的首席技术官 Tom Wilson&#xff0c;围绕 Concured 的人工智能使用情况、Wilson 加入团队的过程、坚持选择MongoDB的原因以及公司未来发展展开讨论。 关于Concured 内容无处不在。无论消费者寻找什么或所处…

解决WSL更新速度慢的方案

在Windows上安装Docker Desktop时&#xff0c;如果选择使用WSL&#xff0c;则可能会出现在运行程序前要求升级WSL的步骤。程序会提示使用下面指令来升级 wsl.exe --update但是升级速度特别慢&#xff0c;于是在网络不稳定的情况下经常会出现下载失败的情况。 百度里一直没搜到…

选择华为HCIE培训机构有哪些注意事项

选择软件培训机构注意四点事项1、口碑&#xff1a;学员和社会人士对该机构的评价怎样&#xff1f; 口碑对于一个机构是十分重要的&#xff0c;这也是考量一个机构好不好的重要标准&#xff0c;包括社会评价和学员的评价和感言。誉天作为华为首批授权培训中心&#xff0c;一直致…

boost::asio::ip::tcp/udp::socket::release 函数为什么限制 Windows 8.1 才可以调用?

如本文题目所示&#xff0c;这是因为只有在 Windows 8.1&#xff08;Windows Server 2012 RC&#xff09;及以上 Windows 操作版本才提供了运行时&#xff0c;修改/删除完成端口关联的ABI接口。 boost::asio 在 release 函数底层实现之中是调用了 FileReplaceCompletionInform…