Runloop

作者: MissSunRise | 来源:发表于2021-05-31 19:23 被阅读0次

没有Runloop:

代码执行完毕后,直接执行return 0。程序执行结束。

有Runloop:

程序并不会马上退出,而是保持运行状态

基本作用:

保持程序的持续运行

处理App中的各种事件

节省CPU资源,提高程序性能

int retVal = 0;.png

当有事件来的时候就处理,完成后就为0,继续睡眠。

RunLoop与线程

一条线程对应一个RunLoop对象

保存方式是 保存在全局的字典当中,以线程为Key,对象为value

生命周期:生->线程创建时,RunLoop第一次被获取的时候创建对象
死->当线程结束时被销毁

主线程一开始就有RunLoop , 子线程默认没有被开启。

模式:

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

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

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

不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响

如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出

常见的2种Mode

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

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

Run Loop Observer Activities.png

执行流程图

执行逻辑:所谓的执行逻辑就是

你不做事,这个App开着其实是在休眠的,CPU没有运行。

但是你一做事情,或收到消息,RunLoop就会接受到事件,去处理一些事情。

处理完以后,再次进入到休眠中,一直循环。

休眠的细节

使用底层代码使CPU停止,而不是使用While循环,这样保证CPU不处理程序的任务,完全的休眠。

等有消息的时候在唤醒线程

Runloop 是怎么响应用户操作的, 具体流程是什么样的?

Source1 捕捉事件
Source0 处理事件

程序中添加每3秒响应一次的NSTimer,当拖动Tableview时timer可能无法响应要怎么解决?

将NSTimer加入到RunLoop对象中去,设置common模式。
Timer与RunLoop的关系。RunLoop里面有Mode,而mode里面有Timer.
当Timer设置common模式时,

结构

// 模式
//1. Name 模式名字
//2. 处理者
//3. 捕捉者
//4. 如果添加了观察者,在这里存放
//5. 存放这个模式能够使用的计时器

typedef struct _CFRunLoopMode CFRunLoopModeRef;.png

//RunLoop 对象
// 1.所在线程
// 2.通用模式,如果有计时器被设置了通用模式,那么这个里面就装着有的对象可以同时多个模式被使用。
// 3.通用模式对象, 存放在这个集合中的对象能够被设置为通用模式
// 4.当前使用的模式
// 5.所有模式

typedef struct CFRunLoop 米 CFRunLoopRef;.png

相关文章

网友评论

      本文标题:Runloop

      本文链接:https://www.haomeiwen.com/subject/kbgbsltx.html