Runloop 小记

一直在断断续续的看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模式下,当滑动时就不会执行该方法,停止滑动后再执行

你可能感兴趣的:(Runloop 小记)