RunLoop总结

2018-04-26  本文已影响13人  ChancePro

Runloops是线程相关底层基础的一部分。它的本质和字面意思一样运行着的循环(事件处理的循环)。
作用:接受循环事件和安排线程的工作。
目的:让线程在有任务的时候忙于工作,而没有任务的时候处于休眠状态。

Runloop概念

Runloop运行循环
iOS中通常所说的Runloop指的是NSRunloop(Foundation框架)或者CFRunloopRef(CoreFoundation框架),CFRunloopRef是纯C的函数,而NSRunloop仅仅是CFRunloopRef的一层OC封装。

Runloop作用

  1. 保持程序的持续运行。
  2. 处理App中的各种事件。(如:touches触摸事件、NSTimer定时器事件、Selector事件)
  3. 节省CPU资源,提高程序性能(有事情就做事情,没事情就休息,资源释放)
  4. 负责渲染屏幕上的所有UI。

Runloop开启&退出

在UIApplicationMain函数内部开启了一个和主线程相关的RunLoop (保证主线程不会被销毁),导致 UIApplicationMain 不会返回,一直在运行中,也就保证了程序的持续运行。
Runloop 的退出条件:
App退出;线程关闭;设置最大时间到期;

RunLoop和线程关系

  1. 每条线程都有唯一的一个与之对应的Runloop对象。
  2. 主线程的RunLoop已经自动创建,子线程的RunLoop需要主动创建。
  3. RunLoop在第一次获取时创建,在线程结束时销毁。
  4. Runloop对象是利用字典来进行存储,Key:线程 Value:线程对应的Runloop
创建子线程对应的Runloop

currentRunLoop

RunLoop相关类

CFRunLoopRef: RunLoop本身
CFRunLoopModeRef: 运行模式
CFRunLoopSourceRef: 事件源
CFRunLoopTimerRef: Timer事件
CFRunLoopObserverRef: 观察者(监听者)

  1. 一条线程 对应一个 Runloop,Runloop 总是运行在某种特定的CFRunLoopModeRef(运行模式)下。
  2. 每个 Runloop 都可以包含若干个 Mode ,每个 Mode 又包含Source源 / Timer事件 / Observer观察者。
  3. 在 Runloop 中有多个运行模式,每次调用 RunLoop 的主函数【__CFRunloopRun()】时,只能指定其中一个 Mode(称 CurrentMode)运行, 如果需要切换 Mode,只能是退出 CurrentMode 切换到指定的 Mode 进入,目的以保证不同 Mode 下的 Source / Timer / Observer 互不影响。
  4. Runloop 有效,mode 里面 至少 要有一个timer(定时器事件) 或者是source(源)。
Mode

kCFRunLoopDefaultMode App的默认Mode,通常主线程是在这个Mode下运行。
UITrackingRunLoopMode 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动
UIInitializationRunLoopMode 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
GSEventReceiveRunLoopMode 接受系统事件的内部 Mode,通常用不到。
kCFRunLoopCommonModes 一种模式组合

Source

Source0:非基于端口Port的事件(用于用户主动触发的事件,如:点击按钮或点击屏幕)。
Source:基于端口Port的事件(通过内核和其他线程互相发送消息)

Timer

NSTimer受RunLoop的Model影响。GCD定时器不受RunLoop影响。

Observer

消息循环中的监听器

RunLoop休眠

RunLoop 最核心的事情就是保证线程在没有消息时休眠以避免占用系统资源,有消息时能够及时唤醒。 RunLoop 的这个机制完全依靠系统内核来完成,具体来说是苹果操作系统核心组件 Darwin 中的 Mach 来完成的。

上一篇下一篇

猜你喜欢

热点阅读