分析IOS RunLoop的事件循环机制
程序员文章站
2022-07-05 13:29:12
在runloop启动之后会发送一个通知,来告知观察者将要处理timer/source0事件这样一个通知的发送处理source0事件如果有source1要处理,这时会通过一个go to语句的实现来进行代...
在runloop启动之后会发送一个通知,来告知观察者
将要处理timer/source0事件这样一个通知的发送
处理source0事件
如果有source1要处理,这时会通过一个go to语句的实现来进行代码逻辑的跳转,处理唤醒是收到的消息
如果没有source1要处理,线程就将要休眠,同时发送一个通知,告诉观察者
然后线程进入一个用户态到内核态的切换,休眠,然后等待唤醒,唤醒的条件大约包括三种:
1、source1
2、timer事件
3、外部手动唤醒
线程刚被唤醒之后也要发送一个通知告诉观察者,然后处理唤醒时收到的消息
回到将要处理timer/source0事件这样一个通知的发送
然后再次进行上面步骤,这就是一个runloop的事件循环机制
内部代码逻辑整理如下:
可以看到,实际上 runloop 就是这样一个函数,其内部是一个do-while循环。当你调用cfrunlooprun()时,线程就会一直停留在这个循环里;直到超时或被手动停止,该函数才会返回
有一个这样的问题:当我们点击一个app,从我们点击到程序启动、程序运行再到程序杀死这个过程,系统都发生了什么呢?
实际上当我们调用了main函数之后,会调用uiapplicationmain函数,在这个函数内部会启动主线程的runloop,然后经过一系列的处理,最终主线程的runloop会处于一个休眠状态,然后我们此时如果点击一下屏幕,会转化成一个source1来让我们的主线程唤醒,然后当我们杀死程序时,会调用runloop的退出,同时发送通知告诉观察者
找到一张总结图帮助记忆:
以上就是分析ios runloop的事件循环机制的详细内容,更多关于ios runloop的事件循环机制的资料请关注其它相关文章!