OC面试相关ios底层原理

Runloop原理(二)

2022-06-22  本文已影响0人  erlich

Runloop原理(一)

之前的 Runloop原理(一) 中测试是在主线程进行的,接下来在子线程中进行

以下涉及的内容均是针对子线程的

Starting the Run Loop

只有在子线程中启动runloop 才是必要的

runloop必须至少有一个inpurt source 或者 timer,如果一个也没有,则runloop 马上退出

启动runloop有几种方式

线程主入口框架版本

image.png

子线程中 没有启动runloop,timer是没办法调度执行的,而且子线程一启动,马上就销毁了

image.png

无条件启动runloop,timer调度执行, 而且直接run runloop,后面的代码执行阻塞

此时 主动让线程exit, timer也停止,说明timer调度是依托于runloop的

runloop添加非基于port的input source

image.png

对于非基于port的input source,runloop休眠,监视source的signal事件,如果没有其他线程对source的signal,runloop将超时 退出

也就是

image.png

runloop通过Core Foundation添加timer

image.png

runloop启动之后有超时,图中设置了10秒超时

虽然timer每5秒触发一次,但timer却是基于runloop调度的

过10秒之后 runloop超时 退出,因为采用了while,所以runloop退出之后又重新启动

添加timer - 直观演示runloop流程序列

为了更直观的了解timer究竟是如何调度的,这里再总结一次

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

关于timer的流程打印总结说明

source的执行是怎么样的

signal + wakeup

image.png

touch 一下

image.png

touch之后,runloop唤醒,此时你会发现,即将进入source之后 --> 执行source --> 退出 --> 进入runloop

唤醒runloop,循环轮询一次,source执行之后,会马上退出。之所以这样,是因为touch显式唤醒runloop会重新启动runloop

退出runloop

有两种方式退出tunloop

虽然移除 input sources 和 timers可以引起runloop退出,但这是不可靠的. 一些系统例程将input sources添加到runloop中以处理所需的事件, 你的代码可能不知道这些input sources,所以无法删除它们,这将阻止runloop退出

线程安全和runloop对象

线程安全取决于你使用哪种api操作runloop

上一篇 下一篇

猜你喜欢

热点阅读