《RunLoop内部实现原理》

2019-06-28  本文已影响0人  不够果断是种癌

说明:本文为极客时间戴铭的《iOS开发高手课》专栏的学习笔记,仅供自我学习,禁止转载。

接下来我们看runLoop的原理。

01.通知observers:RunLoop 要开始进入 loop 了。

02.开启一个 do while 来保活线程。通知 Observers:RunLoop 会触发 Timer 回调、Source0 回调,接着执行加入的 block。

接下来,触发 Source0 回调,如果有 Source1是 ready 状态的话,就会跳转到 handle_msg去处理消息。

03.回调触发后,通知 Observers:RunLoop 的线程将进入休眠(sleep)状态。

04.进入休眠后,会等待 mach_port 的消息,以再次唤醒。只有在下面四个事件出现时才会被再次唤醒:

1.基于 port 的 Source 事件;

2.Timer 时间到;

3.RunLoop 超时;

4.被调用者唤醒。

等待唤醒的代码如下:

05.唤醒时通知 Observer:RunLoop 的线程刚刚被唤醒了。

06.RunLoop 被唤醒后就要开始处理消息了:

如果是Timer时间到的话,就会出发Timer的回调;

如果是dispatch的话,就执行block;

如果是sorce1事件的话,就处理这个事件;

消息执行完后,就执行加到loop里面的block。代码如下;

07.根据当前 RunLoop 的状态来判断是否需要走下一个 loop。当被外部强制停止或loop超时,就不继续下一个loop了,否则继续下一个loop。

整个过程用戴铭老师的一张图来表示:

接下来我们看看loop代码定义的状态。

上一篇 下一篇

猜你喜欢

热点阅读