美文网首页
《RunLoop内部实现原理》

《RunLoop内部实现原理》

作者: 不够果断是种癌 | 来源:发表于2019-06-28 16:44 被阅读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代码定义的状态。

    相关文章

      网友评论

          本文标题:《RunLoop内部实现原理》

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