阅读博文《深入理解RunLoop》后的整理。
博文从RunLoop的底层代码切入,介绍RunLoop的实现原理,并相应的讲解Apple基于RunLoop的开发,例如屏幕触摸,UIGestureRecognizer,performSelector等。
首先简要的说一下写博文介绍的意义。看完一篇博客之后,尝试用自己的话说出来,是梳理知识的过程。同时,也方便我以后快速review,也给各位一个参考。
博文介绍系列尝试用简介明了的话去概括原博文,因此相对来说也不会特别详细,见谅。但是,会将博文中提到的知识点进行罗列,并且会做一些补充。方便查阅。
博文介绍
博文来源:《深入理解RunLoop》
RunLoop机制
简单来说,RunLoop实际上是在不停的循环处理事件。在每一个循环中,如果有事件需要响应则立刻响应,无事件响应时则休眠。
RunLoop结构包含有多个Mode。Mode中保存着Source,Observer,Timer。顾名思义,Source是事件来源,分为两类,Source0类型的事件不会主动唤醒休眠的RunLoop,需要外界主动唤醒;Source1类型的事件利用Mach实现,可以唤醒休眠中的RunLoop。Observer是观察者,RunLoop进入不同的阶段时会相应的通知到Observer。Timer则是计时器的事件。
RunLoop可以在多个Mode之间切换。切换到特定Mode时,只会处理该Mode下的Source/Observer/Timer。不过,RunLoop中还保存着CommonModeItems,在RunLoop内容发生变化时,RunLoop会把CommonModeItems中的Source/Observer/Timer同步到标记为Common的Mode中。
一个线程最多有一个RunLoop。RunLoop在获取的时候创建。新建立的线程如果从来没有获取过RunLoop,则该线程没有对应的RunLoop。