关于Run Loop的了解和学习,查看官方文档是一个不错的选择
Run Loop官方文档
Run Loop 基本作用:
- 01.保持程序的持续运行
- 02.处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)
- 03.节省CPU资源,提高程序性能:该做事时做事,该休息时休息
- 04.和其他线程进行通信
- 05.实现定时器功能
- 06.保持单个线程不死
- …
什么时候调用:(参考官方文档解释)
- 当需要和其他线程的进行通信的时候
- 当使用timer定时器的时候
- 当使用performSelector…方法的时候
- 当保持程序的持续运行和定期执行任务的时候
Run Loop对象的构成
- NSRunLoop和CFRunLoopRef都代表着RunLoop对象
- NSRunLoop是基于CFRunLoopRef的一层OC包装
Run Loop与线程之间的关系
- 每条线程都有唯一的一个与之对应的RunLoop对象
- 主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建
- RunLoop在第一次获取时创建,在线程结束时销毁
获得Run Loop对象
[NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
[NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象
项目中,默认在mian.m中添加了一个Runloop循环,而且这个RunLoop是跟主线程相关联的
Run Loop相关类
Core Foundation中关于RunLoop的5个类
- CFRunLoopRef —————– // runloop对象
- CFRunLoopModeRef ——— // 运行模式
- CFRunLoopSourceRef ——– // 事件源(输入源)
- CFRunLoopTimerRef ——— // NSTimer
- CFRunLoopObserverRef —– // 观察者
官方结构图
CFRunLoopModeRef 代表 RunLoop的运行模式
一个 RunLoop 包含若干个 Mode,每个Mode又包含若干个Source/Timer/Observer
每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode
如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入
常见的2个Mode:
kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
其他运行模式modes
Cocoa Perform Selector Sources(事件源)
- CFRunLoopSourceRef 是事件源(输入源)
- Cocoa Perform Selector Sources 的时候会调用
Run Loop Observers(观察者)
- CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变
翻译为 Run Loop 监听时刻
- 即将进入runloop的时候
- 即将处理timer定时器的时候
- 即将处理输入源的时候
- 当runloop将要休眠的时候
- 当runloop从休眠中唤醒的时候
- 当runloop将要退出的时候
Run Loop Timer Sources(定时器)
timer定时器是Run Loop 必不可少的一部分,通过定时器,可以完成事件的循环监听
关于timer定时器的学习,将在下一篇博客中写出。
最后引用大牛对Run Loop整体分析图: