0%

博文介绍(一)《深入理解RunLoop》

阅读博文《深入理解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运行流程。图片引用自原博客
    RunLoop运行流程
Source1原理

Source1通过调用mach_msg获取事件消息。获取消息实际上是基于port的的进程间通信。在用户态调用mach_msg实则调用了mach_msg_trap陷阱,切换到内核态。内核态的mach_msg才进行处理。如果没有需要响应的消息,内核将用户线程置于等待状态;如果有需要响应的消息,则将消息返回,控制权给回用户线程。

RunLoop实现的功能

以下列举了苹果用RunLoop实现的功能。详细的介绍可以看回原博文。

  • AutoReleasePool
  • 锁屏/触摸等事件响应
  • 手势识别
  • 界面更新
  • 定时器
  • performSelector
  • GCD
  • 网络请求

引用资源

Mac OS X 背后的故事