80-Swift之CADisplayLink的解说

引言

在App的开发中定时器是常用的组件。我们在55 - Swift 之 Timer (NSTimer )定时器已经介绍了Timer。本篇我们将介绍CADisplayLink

1、CADisplayLink 是什么?

CADisplayLink 是一种触发时间和屏幕刷新频率相同的定时器。

2、CADisplaylink 的基本使用方法。

我们在项目中创建一个 CADisplayLink 的对象 A ,同时给他一个 target 和一个 Selector ; 然后,将 A 添加到 RunLoop 中,在屏幕刷新的时候就会触发 ASelector 方法。

3、 CADisplayLink 的几个参数介绍

1、 timestamp

timestamp 是指当前帧开始刷新的时间。

2、duration

duration 是一帧刷新所用时的时间。

3、 targetTimestamp

targetTimestamp 是下一帧开始刷新的时间。

注意:(默认情况下)
targetTimestampdurationtimestamp默认情况下 之间的关系如下:
timestamptargetTimestamp 相差 duration ;即是 :
duration = targetTimestamp - timestamp 的关系。

4、isPaused

isPaused 是阻止屏幕刷新的进行的参数。isPaused 如果为 true 屏幕刷新停止。isPausedflase 屏幕开始刷新。

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()
}

你可能感兴趣的:(80-Swift之CADisplayLink的解说)