说明:本文为极客时间戴铭的《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代码定义的状态。
网友评论