📜  Swift中的计时器(1)

📅  最后修改于: 2023-12-03 15:05:26.486000             🧑  作者: Mango

Swift中的计时器

在 Swift 中,我们可以很方便地使用计时器来实现定时触发事件,如更新 UI、执行某个操作等。本文将介绍 Swift 中的计时器的几种常见用法。

使用 Timer 定时执行操作

我们可以使用 Timer 类来创建定时器,并通过指定时间间隔和执行的代码块来实现定时操作。

创建计时器

下面是一个示例,使用 Timer 创建一个每隔 1 秒钟输出一次 "Hello, world!" 的计时器。

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    print("Hello, world!")
}

在该示例中,我们使用了 scheduledTimer(withTimeInterval:repeats:block:) 方法来创建计时器。该方法接受三个参数:

  • withTimeInterval 表示计时器的时间间隔,单位为秒;
  • repeats 表示是否需要重复执行,true 表示重复执行,false 表示只执行一次;
  • block 表示执行的代码块,可以是一个闭包或函数。
启动和停止计时器

要启动计时器,我们可以使用 Timerfire() 方法;要停止计时器,我们可以使用 invalidate() 方法,并将计时器对象置为 nil。

timer.fire() // 启动计时器

timer.invalidate() // 停止计时器
使用 CADisplayLink 更新 UI

CADisplayLink 是 Core Animation 框架中的一个类,用于协调屏幕的刷新率和视图的更新。我们可以使用 CADisplayLink 来实现动画或周期性地更新 UI。

创建 CADisplayLink

下面是一个示例,使用 CADisplayLink 创建一个每隔 1/60 秒钟更新一次视图的计时器。

let displayLink = CADisplayLink(target: self, selector: #selector(updateView))

displayLink.add(to: .current, forMode: .default)

在该示例中,我们使用了 init(target:selector:) 方法来创建计时器。该方法接受两个参数:

  • target 表示要接收回调的对象;
  • selector 表示要执行的方法。
定义回调函数

接下来,我们需要实现一个 updateView 方法,作为计时器的回调函数,用于更新视图。

@objc func updateView() {
    // 更新视图
}

在该示例中,我们使用了 @objc 关键字来将 updateView 方法标记为 Objective-C 方法,以使其能够被 CADisplayLink 执行。

停止 CADisplayLink

要停止 CADisplayLink,我们可以使用 invalidate() 方法,并将计时器对象置为 nil。

displayLink.invalidate() // 停止计时器
使用 DispatchSource 定时执行操作

除了 Timer 和 CADisplayLink,我们还可以使用 DispatchSource 实现定时执行操作。DispatchSource 是一个基于 GCD 的类,用于处理事件源。

创建 DispatchSourceTimer

下面是一个示例,使用 DispatchSourceTimer 创建一个每隔 1 秒钟输出一次 "Hello, world!" 的计时器。

let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())

timer.schedule(deadline: .now(), repeating: 1.0)

timer.setEventHandler(handler: { print("Hello, world!") })

timer.resume()

在该示例中,我们使用了 makeTimerSource(queue:) 方法来创建计时器。该方法接受一个参数:

  • queue 表示执行回调的队列。

我们还使用了 schedule(deadline:repeating:) 方法设置计时器的间隔时间,setEventHandler(handler:) 方法设置回调函数,以及 resume() 方法启动计时器。

停止 DispatchSourceTimer

要停止 DispatchSourceTimer,我们可以使用 cancel() 方法,并将计时器对象置为 nil。

timer.cancel() // 停止计时器
结语

以上就是 Swift 中的几种计时器的用法。选择哪种计时器,取决于具体的需求和场景。无论使用哪种计时器,务必记得在适当的时候停止它,以免浪费资源或导致异常行为。