iOS关于RunLoop 的总结

255 阅读2分钟

Runloop

Runloop是事件接收和分发机制的一个实现。是线程相关的基础框架的一部分。一个Runloop就是一个事件处理的循环,用来不停的调度工作及处理输入事件。使用runloop的目的就是让你的线程

RunLoop的主要目的:

保证程序执行的线程不会被系统终止,如果没有RunLoop,UIApplicationMain函数执行完毕之后将直接返回,就是说程序一启动然后就结束,在有工作的时候忙于工作,而没有工作的时候处于休眠状态.

什么时候使用Runloop ?

当需要和该线程进行交互的时候才会使用Runloop.

Runloop Mode

一个Runloop可能有几个mode

Runloop Mode 实际上是 SourceTimerObserver 的集合,不同的 Mode 把不同组的Source,Timer和Observer隔绝开来。Runloop 在某个时刻只能跑在一个 Mode 下,处理这一个 Mode 当中的 Source,Timer 和 Observer

苹果文档中提到的 Mode 有五个,分别是:

NSDefaultRunLoopMode:默认的mode,正常情况下都是在这个mode

NSConnectionReplyMode

NSModalPanelRunLoopMode

NSEventTrackingRunLoopMode:使用这个Mode去跟踪来自用户交互的事件(比如UITableView上下滑动)

NSRunLoopCommonModes

iOS 中公开暴露出来的只有 NSDefaultRunLoopModeNSRunLoopCommonModesNSRunLoopCommonModes 实际上是一个 Mode 的集合,默认包括 NSDefaultRunLoopModeNSEventTrackingRunLoopMode

Source

即可以唤醒Runloop的一些事件。比如用户点击了屏幕,就会创建一个input source。

  • source0 : 非系统事件
  • source1 : 系统时间

Timer 我们经常用的NSTimer就属于这一类。

Observer 某个observer可以监听runloop的状态变化,并作出一定反应。

RunLoop运行流程

没有事情的时候,Runloop处于休眠状态。当外部source将其唤醒后,它会依次处理接收到的timer/source,然后再次进入休眠。

阅读原文