计时器 Timer 的简单使用(Swift)

16,492 阅读2分钟

前言

在日常开发中,有时会遇到一些计时的交互,例如一个弹窗在几秒后自动关闭,我们需要把这个倒计时展现给用户。我在开发中使用最多的就是 Foundation 库中的 Timer 类了。现在就是简单地记录下这个类的使用和注意点。

几点注意,开发者文档中有介绍。

  1. Run Loop 对其强引用,自动或者手动添加到 Run loop 后,不再需要设置实例强引用 Timer。

  2. Timer 触发后(自动或者手动调用.fire())后,在停止计时,或者不再需要运行计时器时,需要手动销毁。

  3. 设置 Timer 的宽容度tolerance属性,能优化性能和减少机器耗电。一般重复的 Timer 至少设置10%。

Timer 自动开始和手动开始

1. 创建后自动开始计时

下边的两个类方法,是在当前 Run Loop 创建计时器,并自动开始运行。

class func scheduledTimer(withTimeInterval: TimeInterval, repeats: Bool, block: (Timer) -> Void) -> Timer

class func scheduledTimer(timeInterval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool) -> Timer

例子:一个简单的5秒倒计时 timer

var countDownNum = 5
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    if countDownNum == 0 {
      	// 销毁计时器
        timer.invalidate()
        // countDownNum = 5
        print(">>> Timer has Stopped!")
    } else {
        print(">>> Countdown Number: \(countDownNum)")
        countDownNum -= 1
    }
}

2. 创建一个计时器,需要手动开始计时

创建后,需要手动添加到一个 Run Loop,设置Run Loop Mode,然后手动开始计时。

init(timeInterval: TimeInterval, repeats: Bool, block: (Timer) -> Void)

init(timeInterval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)

// 设定时间,告诉计时器何时开始
init(fire: Date, interval: TimeInterval, repeats: Bool, block: (Timer) -> Void)

init(fireAt: Date, interval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)

例子:一个简单的5秒倒计时

var countDownNum = 5
let countdownTimer = Timer(timeInterval: 1.0, repeats: true) { timer in
    if countDownNum == 0 {
      	// 销毁计时器
        timer.invalidate()
        // countDownNum = 5
        print(">>> Timer has Stopped!")
    } else {
        print(">>> Countdown Number: \(countDownNum)")
        countDownNum -= 1
    }
}
// 设置宽容度
countdownTimer.tolerance = 0.2
// 添加到当前 RunLoop,mode为默认。
RunLoop.current.add(countdownTimer, forMode: .default)
// 开始计时
countdownTimer.fire()

其它 Timer 属性

isValid用于判断计时器是否有效

当销毁计时器时.invalidate(),此属性为 false。如果还能.fire(),此属性为 true。

可用于判断重复运行的计时器是否还在运行。