关于RunLoop

2019-08-05  本文已影响0人  ChiralKing

顾名思义:运行循环,在程序运行中循环做一些事情。
应用范畴:定时器(Timer),performSelectorGCD Async Main Queue,事件响应,手势识别,界面刷新,网络请求,AutoreleasePool
基本作用:保持程序的持续运行,处理App中的各种事件(比如触摸事件,定时器事件等),节省CPU资源,提高程序性能(该做事时做事,该休息时休息)

执行完第13行代码后,程序会退出.png 程序会在需要的时候响应,不需要的时候进行休眠.png

图二相比图一,这都是RunLoop的作用,说明在UIApplicationMain的方法中已经嵌入了RunLoop

RunLoop的伪代码:

RunLoop代码实现.png

iOS中有两套API来访问和使用RunLoop
1.FoundationNSRunLoop
2.Core FoundationCFRunLoopRef
两者都表示RunLoop对象,NSRunLoop是基于CFRunLoopRef的一层OC封装

获取RunLoop对象:
Foundation:[NSRunLoop currentRunLoop],[NSRunLoop mainRunLoop]
Core Foundation:CFRunLoopGetCurrent(),CFRunLoopGetMain()

RunLoop相关的类(Core Foundation中关于RunLoop的五个类):
CFRunLoopRefCFRunLoopModeRefCFRunLoopSourceRef(事件源),CFRunLoopTimerRef(计时器),CFRunLoopObserverRef

CFRunLoopRef
CFRunLoopModeRef代表运行模式
RunLoop

source0: 指的是非基于端口por,说白了也就是处理触摸事件,selector事件
source1:基于端口的port,是处理系统的一些事件
timers:定时器,NSTimer
observers:监听器,监听RunLoop的运行状态,可以监听的时间有即将进入Loop,即将处理Timer,即将处理Source,即将进入休眠,刚从休眠中唤醒,即将退出Loop

一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/ObserverRunLoop启动时只能选择其中一个Mode,作为currentMode。如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入。不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响。如果Mode里没有任何Source0/Source1/Timer/ObserverRunLoop会立马退出。

目前已知的Mode有五种:
1.kCFRunLoopDefaultMode:App的默认Mode,通常主线程在这个Mode下运行
2.UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响
3.UIInitializationRunLoopMode:在刚启动App时进入的第一个Mode,启动完成后不再使用
4.GSEventReceiveRunLoopMode:接收系统事件的内部Mode,通常用不到
5.kCFRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode

RunLoop与线程:
RunLoop和线程:每条线程都有唯一的一个与之对应的RunLoop对象,RunLoop保存在全局的字典中,线程作为key,RunLoop作为value,线程刚创建的时候并没有RunLoop对象,RunLoop会在第一次获取的时候创建,RunLoop会在线程结束时销毁。

RunLoop的运行逻辑:

RunLoop运行逻辑

本文结束。

上一篇下一篇

猜你喜欢

热点阅读