引言
在App的开发中定时器是常用的组件。我们在55 - Swift 之 Timer (NSTimer )定时器已经介绍了Timer。本篇我们将介绍CADisplayLink。
1、CADisplayLink 是什么?
CADisplayLink 是一种触发时间和屏幕刷新频率相同的定时器。
2、CADisplaylink 的基本使用方法。
我们在项目中创建一个 CADisplayLink 的对象 A ,同时给他一个 target 和一个 Selector ; 然后,将 A 添加到 RunLoop 中,在屏幕刷新的时候就会触发 A 的 Selector 方法。
3、 CADisplayLink 的几个参数介绍
1、 timestamp
timestamp 是指当前帧开始刷新的时间。
2、duration
duration 是一帧刷新所用时的时间。
3、 targetTimestamp
targetTimestamp 是下一帧开始刷新的时间。
注意:(默认情况下)
targetTimestamp 和 duration 和 timestamp 在 默认情况下 之间的关系如下:
timestamp 与 targetTimestamp 相差 duration ;即是 :
duration = targetTimestamp - timestamp 的关系。
4、isPaused
isPaused 是阻止屏幕刷新的进行的参数。isPaused 如果为 true 屏幕刷新停止。isPaused 为 flase 屏幕开始刷新。
5、invalidate() 函数
invalidate() 这个函数我们并不陌生,我们在 OC 的 NSTime 和 Swift 的 Timer 中都见过它。invalidate() 该函数的作用是停止定时,同时释放定时器对象。
6、open func add(to runloop: RunLoop, forMode mode: RunLoopMode) 函数
open func add(to runloop: RunLoop, forMode mode: RunLoopMode) 该函数的作用是将创建的 CADisplayLink 对象加入到 RunLoop 中,才能在屏幕刷新的时候,执行定时器的 selector 方法。
7、 open func remove(from runloop: RunLoop, forMode mode: RunLoopMode) 函数
open func remove(from runloop: RunLoop, forMode mode: RunLoopMode) 该函数的作用是将添加的 CADisplayLink 对象从 RunLoop 中移除,停止定时作用,减轻Cup的负担。
8 、 preferredFramesPerSecond
preferredFramesPerSecond 该参数的作用是设置屏幕在一分钟内刷新的帧数。默认为60,当设置为0 的时候将和屏幕刷新频率相同,该参数在 ios 10.0 以上可是使用。
4、 CADisplaylink 的使用
// MARK: 创建一个CADisplayLink的对象
func budlingDisplayLink() -> Void {
// 创建对象
let displayLink = CADisplayLink.init(target: self, selector: #selector(displayLinkClick(_:)))
// 设置触发频率
if #available(iOS 3.1, *) {
//设置一秒内有几帧刷新,默认60,即是一秒内有60帧执行刷新调用。
displayLink.preferredFramesPerSecond = 3
}else {
displayLink.frameInterval = 2
}
// 加入循环
displayLink.add(to: RunLoop.main, forMode: .defaultRunLoopMode)
}
@objc func displayLinkClick(_ displayLink:CADisplayLink) -> Void {
// 当前帧开始刷新的时间
print(displayLink.timestamp)
// 一帧刷新使用的时间
print(displayLink.duration)
// 下一帧开始刷新的时间
print(displayLink.targetTimestamp)
// TODO: displayLink.timestamp 与 displayLink.targetTimestamp 相差 displayLink.duration ;即是 : displayLink.duration = displayLink.targetTimestamp - displayLink.timestamp 的关系。
// 暂停帧的刷新 true:停 ; false:开始
displayLink.isPaused = true
// 将定时器移除主循环
displayLink.remove(from: RunLoop.main, forMode: .defaultRunLoopMode)
// 停止定时器
displayLink.invalidate()
}