Runloop
Runloop是事件接收和分发机制的一个实现。是线程相关的基础框架的一部分。一个Runloop就是一个事件处理的循环,用来不停的调度工作及处理输入事件。使用runloop的目的就是让你的线程
RunLoop的主要目的:
保证程序执行的线程不会被系统终止,如果没有RunLoop,UIApplicationMain函数执行完毕之后将直接返回,就是说程序一启动然后就结束,在有工作的时候忙于工作,而没有工作的时候处于休眠状态.
什么时候使用Runloop ?
当需要和该线程进行交互的时候才会使用Runloop.
Runloop Mode
一个Runloop可能有几个mode
Runloop Mode 实际上是 Source,Timer 和 Observer 的集合,不同的 Mode 把不同组的Source,Timer和Observer隔绝开来。Runloop 在某个时刻只能跑在一个 Mode 下,处理这一个 Mode 当中的 Source,Timer 和 Observer。
苹果文档中提到的 Mode 有五个,分别是:
NSDefaultRunLoopMode:默认的mode,正常情况下都是在这个mode
NSConnectionReplyMode
NSModalPanelRunLoopMode
NSEventTrackingRunLoopMode:使用这个Mode去跟踪来自用户交互的事件(比如UITableView上下滑动)
NSRunLoopCommonModes
iOS 中公开暴露出来的只有 NSDefaultRunLoopMode 和 NSRunLoopCommonModes。 NSRunLoopCommonModes 实际上是一个 Mode 的集合,默认包括 NSDefaultRunLoopMode 和 NSEventTrackingRunLoopMode。
Source
即可以唤醒Runloop的一些事件。比如用户点击了屏幕,就会创建一个input source。
- source0 : 非系统事件
- source1 : 系统时间
Timer 我们经常用的NSTimer就属于这一类。
Observer 某个observer可以监听runloop的状态变化,并作出一定反应。
RunLoop运行流程
没有事情的时候,Runloop处于休眠状态。当外部source将其唤醒后,它会依次处理接收到的timer/source,然后再次进入休眠。