RunLoop相关

2019-08-10  本文已影响0人  内心强大的Jim

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
上一篇 下一篇

猜你喜欢

热点阅读