阅读博文《深入理解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。
- RunLoop运行流程。图片引用自原博客。
Source1原理
Source1通过调用mach_msg获取事件消息。获取消息实际上是基于port的的进程间通信。在用户态调用mach_msg实则调用了mach_msg_trap陷阱,切换到内核态。内核态的mach_msg才进行处理。如果没有需要响应的消息,内核将用户线程置于等待状态;如果有需要响应的消息,则将消息返回,控制权给回用户线程。
RunLoop实现的功能
以下列举了苹果用RunLoop实现的功能。详细的介绍可以看回原博文。
- AutoReleasePool
- 锁屏/触摸等事件响应
- 手势识别
- 界面更新
- 定时器
- performSelector
- GCD
- 网络请求
引用资源
Mac OS X 背后的故事
- Mac OS X 背后的故事(一)力挽狂澜的Ellen Hancock
- Mac OS X 背后的故事(二)Linus Torvalds的短视
- Mac OS X 背后的故事(三)Mach之父Avie Tevanian
- Mac OS X 背后的故事(四)政客的跨界
- Mac OS X 背后的故事(五)Jean-Marie Hullot的Interface Builder神话
- Mac OS X 背后的故事(六)Cordell Ratzlaff 引发的 Aqua 革命(上)
- Mac OS X 背后的故事(七)Cordell Ratzlaff 引发的 Aqua 革命(下)
- Mac OS X 背后的故事(八)三好学生Chris Lattner的LLVM编译工具链
- Mac OS X 背后的故事(九)半导体的丰收(上)
- Mac OS X 背后的故事(十)半导体的丰收(中)
- Mac OS X 背后的故事(十一)半导体的丰收(下)
- Mac OS X 背后的故事(十二)Mac OS X文件系统的来龙去脉(上)
- Mac OS X 背后的故事(十三)Mac OS X文件系统的来龙去脉(下)
- Mac OS X 背后的故事(十四)向Intel迁移!(上)
- Mac OS X 背后的故事(十五)向Intel迁移!(中)