概念
数据结构
事件循环机制
Runloop 与 NSTimer
什么是RunLoop
是通过内部维护事件循环来对事件/消息管理的对象
- 事件循环
- 没有消息需要处理时,休眠以避免资源占用
用户态 => 内核态 - 有消息要处理,立即唤醒
内核态 => 用户态
在main函数中会启动主香橙的runloop,有事做做事,没事做的时候用户态像内核态转换,维护事件循环机制,实现瞬变状态
截屏2021-04-02下午11.25.25.png
runloop的数据结构
NSRunLoop 是对CFRunLoop的封装,提供面向对象的API,在Fonddation中
CFRunLoop,在CoreFonddation中,源码开放
- CFRunLoop
- CFRunLoopMode
- Source/Timer/Observer
-
CFRunLoop
phread
currentMode
modes<集合都是mode对象>
commonModes<集合都是字符串>
commonModesItem<集合多个observer Timer Source> -
CFRunLoopMode
name
sources0
sources1
observer
timers -
CFRunLoopSources
sources0手动唤醒线程
sources1有唤醒线程能力 -
CFRunLoopTimer
和NSTimer合一免费桥转换 -
CFRunLoopObserver
观测事件点
- kCFRunLoopEntry
- kCFRunLoopBeforeTimers
- kCFRunLoopBeforeSources
- kCFRunLoopBeforeWaitting(用户态到内核态)
5.kCFRunLoopAfterWating
6.kCFRunLoopExit
-
各个数据结构之间关系
runloop和Model是1对多的
model和source timer observer 是1对多的关系
截屏2021-04-02下午11.42.47.png -
RunLoop的Mode
截屏2021-04-02下午11.43.29.png
运行在mode1上的不会处理别的Mode
滑动TableView时候滚动条不会滚动是什么原因呢?
一个Timer怎么加入到2个Mode上的?
- CommonMode的特殊性
是一个实际不存在的mode是字符串的识别
是同步Source/Timer/Observer到多个Mode的一种实现机制
和default完全不一样
事件循环机制
void CFRunLoopRun()
截屏2021-04-02下午11.50.30.png-
runloop核心
截屏2021-04-02下午11.51.46.png
Runloop 与 NSTimer关系
滑动Tablview时候定时器还会生效吗?
截屏2021-04-02下午11.53.24.png
CFRunLoopAddTimer(runloop,Timer,Commonmodes)添加到多个Mode上
RunLoop和多线程关系
一一对应
线程的runLoop一般是没有开启的
- 怎么实现一个常驻线程
- 为当前线程添加一个Runloop
- 向RunLoop中添加一个Port/Source等来维持时间循环
- 启动该runLoop
- 常驻线程的代码实现
runloop总结
什么是runloop,他是怎么做到有事没事休息的?
(用户态到和核心态)
runloop和线程之间的关系?(一一对应)
如何实现一个常驻线程?
123步骤,运行的模式和资源添加的必须是同一个)
怎么样保证子线程回来更新UI的时候不打断用户的滑动操作?
(包装提交到default下)
网友评论