RunLoop对象与线程

15 篇文章 0 订阅

iOS中有2套API来访问和使用RunLoop

1.Foudation: NSRunLoop

2.Core Foudation:CFRunLoopRef

NSRunLoop和CFRunLoopRef都代表着RunLoop对象

NSRunLoop是基于CFRunLoopRef的一层OC包装

CFRunLoopRef是开源的

https://opensource.apple.com/tarballs/CF/

每条线程都有唯一的一个与之对应的RunLoop对象

RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value

线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建

RunLoop会在线程结束时销毁

主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop

获取RunLoop对象

Foudation

[NSRunLoop currentRunLoop]; // 获取当前线程的RunLoop对象

[NSRunLoop mainRunLoop]; // 获取主线程的RunLoop对象

Core Foudation

CFRunLoopGetCurrent(); // 获取当前线程的RunLoop对象

CFRunLoopGetMain(); // 获得主线程的RunLoop对象

Core Foundation中关于RunLoop的5个类

1.CFRunLoopRef

2.CFRunLoopModeRef

3.CFRunLoopSourceRef

4.CFRunLoopTimerRef

5.CFRunLoopObserverRef

 

 

 

CFRunLoopModeRef代表RunLoop的运行模式

1.一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer

2.RunLoop启动时只能选择其中一个Mode,作为currentMode

3.如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入

4.不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响

5.如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出

CFRunLoopModeRef

常见的2种mMode

1.kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行

2.UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响

RunLoop的运行逻辑

1.Source0

触摸事件处理

performSelector:onThread:

2.Source1

基于Port的线程间通信

系统事件捕捉

3.Timers

NSTimer

performSelector:withObject:afterDelay:

4.Observers

用于监听RunLoop的状态

UI刷新(BeforeWaiting)

Autorelease pool(BeforeWaiting)

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

 

 CFRunLoopObserverRef

 添加Observer监听RunLoop的所有状态

RunLoop休眠的实现原理以及在实际开发中的应用 

 

1.控制线程生命周期(线程保活)

2.解决NSTimer在滑动时停止工作的问题

3.监控应用卡顿

4.性能优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值