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的处理流程
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ​ 前言:一般代码运行完就结束了,为何APP就一直能保持运行状态呢?这个秘诀就是RunLoop,本文先介绍了Ru...
    阿饼six阅读 487评论 1 7
  • 什么是Runloop? 顾名思义:运行循环,就是在程序运行过程中,循环的做一些事情。因为runloop在我们写业务...
    大冯宇宙阅读 338评论 0 0
  • RunLoop:是通过内部维护的事件循环来对事件/消息进行管理的一个对象,能在程序中循环做些事情,可以让开发者间接...
    分流替躺欧阳克阅读 154评论 0 0
  • __CFRunLoops是一个字典已线程作为key CFRunLoopRef作为value 从以上代码分析可以看到...
    大墙66370阅读 3,867评论 1 10
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,568评论 16 22