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

推荐阅读更多精彩内容

  • 深入理解RunLoop 由ibireme| 2015-05-18 |iOS,技术 RunLoop 是 iOS 和 ...
    橙娃阅读 711评论 1 2
  • 转载:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling阅读 1,362评论 0 13
  • RunLoop 的概念 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线...
    Mirsiter_魏阅读 492评论 0 2
  • https://blog.ibireme.com/2015/05/18/runloop/ RunLoop 是 iO...
    SmallDe阅读 589评论 0 51
  • 转自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飘金阅读 864评论 0 4