RunLoop(2)--RunLoop的补充

CFRunLoopModeRef

从上一篇中我们知道:

1.CFRunLoopModeRef代表RunLoop的运行模式
2.一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer
3.RunLoop启动时只能选择其中一个Mode,作为currentMode,如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入
4.不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响
5.如果Mode里没有任何Source0/Source1/Timer/ObserverRunLoop会立马退出

在程序中我们常见的Model有两种:

1.kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行。
2.UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响

CFRunLoopObserverRef

CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变。

Runloop的状态:


runloop的状态.png

添加Observer监听RunLoop的所有状态的方法:

监听RunLoop的所有状态

RunLoop的运行逻辑

关于model中对象的事件功能:

  • Source0
  1. 触摸事件处理
  2. performSelector:onThread:
  • Source1
  1. 基于Port的线程间通信
  2. 系统事件捕捉,然后再包装成Source0事件处理
  • Timers
  1. NSTimer定时器
  2. performSelector:withObject:afterDelay:(绑定线程执行或者方法延迟执行)
  • Observers
  1. 用于监听RunLoop的状态
  2. UI刷新(BeforeWaiting)
  3. Autorelease pool(BeforeWaiting)

runloop的处理流程:

  1. 通知Observers:进入Loop
  2. 通知Observers:即将处理Timers
  3. 通知Observers:即将处理Sources
  4. 处理Blocks
  5. 处理Source0(可能会再次处理Blocks)
  6. 如果存在Source1,就跳转到第8步
  7. 通知Observers:开始休眠(等待消息唤醒)
  8. 通知Observers:结束休眠(被某个消息唤醒)
    当有这些任务中的某种过来:
    01> 处理Timer
    02> 处理GCD Async To Main Queue
    03> 处理Source1
  9. 处理Blocks
  10. 根据前面的执行结果,决定如何操作
    01>还有任务 -- 回到第02步
    02> 没有任务了 --- 退出Loop
  11. 通知Observers:退出Loop
runloop的处理流程

你可能感兴趣的:(RunLoop(2)--RunLoop的补充)