RunLoop思考
- 讲讲RunLoop,项目中实际应用?
- RunLoop内部实现逻辑以及数据结构?
- RunLoop和线程的关系?
- timer和RunLoop的关系?
- NSTime连续响应拖动tableView可能无法响应为什么?怎么解决?
- RunLoop是怎么响应用户操作的?具体流程是怎么样的?
- 说说RunLoop的几种状态?
- RunLoop中Model的作用?
RunLoop:运行循环,程序在循环过程中,做一些事情.
应用范围:- 定时器,PerformSelector
- GCD Async Main Queue
- 时间响应,手势识别,界面刷新
- 网络请求
- AutoreleasePool
是保证程序一直在运行的基础.
理解两种状态?
用户态和内核态之间的切换
RunLoop对象:
Foundation框架下的RunLoop对象
Core Foundation框架下的CFRunLoop.
RunLoop与线程
- 每一条线程都有唯一与之对应的RunLoop对象.
- RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value
- 线程刚创建的时候并没有RunLoop对象,RunLoop会在第一次获取的时候创建(调用currentRunLoop此时如果没有就会创建)
- 主线程默认开启一条RunLoop(mainRunLoop和currentRunLoop主线程同一个对象),子线程默认没有创建RunLoop,需要调用currentRunLoop创建.
RunLoop相关的类
CFRunLoopRef:RunLoop相关
CFRunLoopModelRef:Model相关
CFRunLoopSourceRef:Source相关
CFRunLoopTimerRef:Timer相关
CFRunLoopObserverRef:Observer相关
C语言底层截图:
理解runloop,currentMode,modes,source,timer,Observer之间的对应关系.
- CFRunLoopModeRef代表RunLoop的运行模式
- 一个RunLoop可以对应多个mode,就是modes,但是只能选择一种mode运行.mode内有对用多个sources,times,Observers.
- RunLoop启动时只能选择一个mode,作为currentMode
- 如果需要切换Mode,只能退出当前loop(退出当前循环的代码,重新进入循环),再重新选择一个Mode进入
为什么?
比如滚动模式下,不处理其他的事情.让app运行更流畅.
RunLoopMode
有多少种Mode
很多种,常用两种.
- NSDefaultRunLoopMode(kCFRunLooDefault):APP默认Mode,通常主线程在这个mode下运行.
- UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响.
Source0
通过调用堆栈打印发现:
- 触摸事件
- perFormSelector:onThread:
Source1
- 基于Port的线程间通信
- 系统事件捕捉(先由source1捕捉给source0处理)
Timer
- NSTimer
- perFormSelector:withObject:afterDelay:
Observer
- 用于监听RunLoop的状态
- UI刷新(在RunLoop将要休眠的时候渲染刷新)
- Autorelease自动释放池
RunLoop状态监听
进入RunLoop,退出RunLoop,休眠状态,唤醒状态等
- kCFRunLoopEnter
网友评论