RunLoop相关类
- CFRunLoopRef
- CFRunLoopModeRef
- runloop运行模式
- 在runloop中可能有多个mode ,runloop运行中只能有一个__mode__, __mode__中包括 source,timer,Observer(监听runloop的状态)
- CFRunLoopSourceRef
- 事件源
- 输入源
- CFRunLoopTimerRef
- 定时器事件
- CFRunLoopObserverRef
- 能够监听RunLoop的状态改变
- CFRunLoopModeRef
- 它是RunLoop的运行模式
默认注册5个Mode
1. **kCRunLoopDefaultMode:** : App默认Mode,通常主线程在这个Mode下运行
2. **UITrackingRunLoopMode**: 界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不被其他Mode影响
3. **UIInitializationRunLoopMode** : 在刚启动App时进入的第一个Mode,启动完成之后就不再使用,
4. **GSRventReceiveRunLoopMode**: 接受系统事件的内部Mode, 通常用不到
5. **kCFRunLoopCommonModes**:这是一个占位用的Mode,不是一种真正的Mode
GCD中的运行时
- 创建GCD中的定时器
- 第一个参数; source 的类型DISPATCH_SOURCE_TYPE_TIMER 表示是定时器
- 第二个参数: 描述信息,线程ID
- 第三个参数:更详细的描述信息
- 第四个参数: 队列,决定GCD定时器中的任务在哪个线程中执行
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0,0,
dispatch_get_global_queue(0,0));
- 设置定时器(起始事件| 间隔事件|精准度)
- 第一个参数: 定时器对象
- 第二个参数: 起始事件, DISPATCH_TIME_NOW 从现在开始计时
- 第三个参数: 间隔事件, 2.0, GCD中事件单位为纳秒
- 第四个参数: 精准度 绝对精准 0
GCD定时器的好处
- GCD定时器是绝对精准的
- 相对于NSTimer不会被当前模式的影响
RunLoop 内部实现机制
RunLoop 应用
- NSTimer
- imageView显示
- PerformSelector
- 常驻线程
- 自动释放池
// 创建线程
self.thread = [[NSThread alloc]initWithTarget:self selector:@selector(task1),object:nil];
[self.thread start];
什么是RunLoop
- 运行循环
- 它内部就是
do-while
,在这个循环内部不断的处理各种任务(比如Source、Timer、Observer) - 一个线程对应一个RunLoop,住县城的Runloop默认启动,自线程得手动启动(调用run方法)
- Runloop 只能选择一个Mode启动,如果当前没有任何Source(Source0、Source1…)、Timer,那么就直接退出RunLoop
自动释放池什么时候释放
- 第一次创建: 启动RunLoop
- 最后一次销毁: runloop退出的时候
- 其他时候的创建和销毁: 当runloop即将睡眠的时销毁之前的释放池,重新创建一个新的
runloop在实际开发中的应用场景
-
开启一个常驻线程
- 在子线程中开启一个定时器
- 在子线程中进行一些长期监控
-
可以控制定时器在特定模式下执行
-
可以让某些事件(行为、任务)在特定模式下执行
-
可以添加Observer监听Runloop的状态,比如监听点击事件处理(在所有点击事件之前做一些事情)