RunLoop问题简单阐述

1、什么是RunLoop?

  • 顾名思义:
    1、运行循环,在程序运行过程中循环做一些事情。
    2、iOS中有2套API来访问和使用RunLoop
    √ Foundation:NSRunLoop
    √ Core Foundation:CFRunLoopRef
    3、NSRunLoop和CFRunLoopRef都代表着RunLoop对象
    4、NSRunLoop是基于CFRunLoopRef的一层OC包装
    5、CFRunLoopRef是开源的

  • RunLoop的基本作用:
    1、保持程序的持续运行
    2、处理App中的各种事件(比如触摸事件、定时器事件等)
    3、节省CPU资源,提高程序性能:该做事时做事,该休息时休息
    ......

  • CFRunLoopModeRef
    √ CFRunLoopModeRef代表RunLoop的运行模式
    √ 一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer
    √ RunLoop启动时只能选择其中一个Mode,作为currentMode
    √ 如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入
    √ 不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响
    √ 如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出
    √ kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行
    √ UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响

  • 应用范畴:
    √ 定时器(Timer)、PerformSelector
    √ GCD Async Main Queue
    √ 事件响应、手势识别、界面刷新
    √ 网络请求
    √ AutoreleasePool

  • RunLoop在实际开中的应用
    √ 控制线程生命周期(线程保活)
    √ 解决NSTimer在滑动时停止工作的问题
    √ 监控应用卡顿
    √ 性能优化

2、RunLoop与线程关系?

  • 每条线程都有唯一的一个与之对应的RunLoop对象
  • RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value
  • 线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建
  • RunLoop会在线程结束时销毁
  • 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop

3、RunLoop的运行逻辑?

 

image


3.1、各种事件解析

 

  • Source0
    代码断点
    触摸事件处理
    performSelector:onThread:

  • Source1
    基于Port的线程间通信
    系统事件捕捉

  • Timers
    NSTimer
    performSelector:withObject:afterDelay:

  • Observers
    用于监听RunLoop的状态
    UI刷新(BeforeWaiting)
    Autorelease pool(BeforeWaiting)

3.2、运行逻辑
01、通知Observers:进入Loop
02、通知Observers:即将处理Timers
03、通知Observers:即将处理Sources
04、处理Blocks
05、处理Source0(可能会再次处理Blocks)
06、如果存在Source1,就跳转到第8步
07、通知Observers:开始休眠(等待消息唤醒)
08、通知Observers:结束休眠(被某个消息唤醒)
01> 处理Timer
02> 处理GCD Async To Main Queue
03> 处理Source1
09、处理Blocks
10、根据前面的执行结果,决定如何操作
01> 回到第02步
02> 退出Loop
11、通知Observers:退出Loop

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值