一直在断断续续的看Runloop的一些使用,在项目中有偶尔有使用,这次再来复习,就简单的记录一些笔记,纯属个人笔记比较凌乱,因为还在继续学习,等补充完后再来从新编辑,内容主要是对网上一些内容的总结和记录
RunLoop 实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行事件循环(Event Loop)的逻辑, Event Loop可以看做一个一直在等待消息处理事件的循环,直到循环结束
Mach Port: CFMachPort、CFMessagePort
Autorelease与RunLoop
Autorelease: UIKit通过RunloopObserver在Runloop的两次Sleep之间对AutoreleasePool进行Pop和Push,将在这次loop产生的Autorelease对象释放
RunLoopMode
Runloop在同一时间只能且必须在一种特定的Mode下运行,这个Mode被称作 CurrentMode。更换Mode时,需要停止当前的Loop,然后重启新的Loop
NSDefuatRunLoopMode: 默认状态/空闲状态
UITrackingRunLoopMode: 滑动ScrollView时,控件需要连续追踪时
UIInitializationRunLoopMode: 私有、App启动时,第一个页面创建后会切换成NSDefuatRunLoopMode
NSRunLoopCommonModes: 包含NSDefuatRunLoopMode、UITrackingRunLoopMode两个状态下可执行的内容,也可以手动再添加Mode
Topic: UITrackingRunLoopMode 与 Timer
使用默认方式设置添加的Timer默认在NSDefuatRunLoopMode模式下,当ScrollView等滑动时模式会被切换到 UITrackingRunLoopMode,就会影响到Timer的计时,所以可以将Timer添加到NSRunLoopCommonModes下的RunLoop中
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
RunLoop的挂起和唤醒
- 指定用于唤醒的mach_port端口
- 调用mach_msg监听唤醒端口,被唤醒前,系统内核将这个线程挂起,停留在mach_msg_trap状态
RunLoop使用
例:TableView(滚动时)延迟加载图片
let downloadImage = ...
avatarImageView.perform(#selector(setter: UIImageView.image), with: downloadImage, afterDelay: 0, inModes: [.defaultRunLoopMode])
将图片设置的方法放到DefuatRunLoopMode模式下,当滑动时就不会执行该方法,停止滑动后再执行