RunLoop相关
iOS底层原理总结 - RunLoop
解密 Runloop
Runloop是一种在当前线程,持续调度各种任务的运行机制。
while(alive) {
performTask() //执行任务
callout_to_obsever() //通知外部,用于告知外部某个任务已被执行,或者是runloop当前处于什么状态。
sleep() //休眠
}
performTask主要有
DoBlocks(),
DoSources0(),
DoSources1(),
DoTimers(),
DoMainQueue()
callout_to_obsever主要有
DoObservers-Timer,
DoObservers-Source0,
DoObservers-Activity(分为kCFRunLoopEntry,kCFRunLoopBeforeTimers,kCFRunLoopBeforeSources,kCFRunLoopBeforeWaiting,kCFRunLoopAfterWaiting,kCFRunLoopExit,kCFRunLoopAllActivities)
一个RunLoop包含若干个Mode,每个Mode又包含若干个Source、Timer、Observer。
每次RunLoop启动时,只能指定其中一个Mode,这个Mode被称作CurrentMode,如果需要切换Mode,只能退出RunLoop,在重新制定一个Mode进入,这样做主要是为了分割不同组的Source,Timer,Observer,让其互不影响。但是必须至少有一个Source或者Timer,如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出
RunLoop有5种运行模式
1.kCFRunLoopDefaultMode: App的默认Mode,通常主线程是在这个Mode下运行
2.UITrackingRunLoopMode:界面追踪Mode,用于Scrollview追踪触摸滚动,保证界面滑动时不受其他Mode影响
3.UIInitializationRunLoopMode:在刚启动App时进入的第一个Mode,启动完成后就不再使用,会切换到kCFRunLoopDefaultMode
4.GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常用不到
5.KCFRunLoopCommonModes:这是一个占位用的Mode,作为标记kCFRunLoopDefaultMode和UITrackingRunLoopMode用,并不是一种真正的Mode
最后引用MrPeak的一张图:
rl00.png