📅  最后修改于: 2023-12-03 15:05:26.486000             🧑  作者: Mango
在 Swift 中,我们可以很方便地使用计时器来实现定时触发事件,如更新 UI、执行某个操作等。本文将介绍 Swift 中的计时器的几种常见用法。
我们可以使用 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
表示执行的代码块,可以是一个闭包或函数。要启动计时器,我们可以使用 Timer
的 fire()
方法;要停止计时器,我们可以使用 invalidate()
方法,并将计时器对象置为 nil。
timer.fire() // 启动计时器
timer.invalidate() // 停止计时器
CADisplayLink 是 Core Animation 框架中的一个类,用于协调屏幕的刷新率和视图的更新。我们可以使用 CADisplayLink 来实现动画或周期性地更新 UI。
下面是一个示例,使用 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,我们可以使用 invalidate()
方法,并将计时器对象置为 nil。
displayLink.invalidate() // 停止计时器
除了 Timer 和 CADisplayLink,我们还可以使用 DispatchSource 实现定时执行操作。DispatchSource 是一个基于 GCD 的类,用于处理事件源。
下面是一个示例,使用 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,我们可以使用 cancel()
方法,并将计时器对象置为 nil。
timer.cancel() // 停止计时器
以上就是 Swift 中的几种计时器的用法。选择哪种计时器,取决于具体的需求和场景。无论使用哪种计时器,务必记得在适当的时候停止它,以免浪费资源或导致异常行为。