前言
在日常开发中,有时会遇到一些计时的交互,例如一个弹窗在几秒后自动关闭,我们需要把这个倒计时展现给用户。我在开发中使用最多的就是 Foundation 库中的 Timer 类了。现在就是简单地记录下这个类的使用和注意点。
几点注意,开发者文档中有介绍。
-
Run Loop 对其强引用,自动或者手动添加到 Run loop 后,不再需要设置实例强引用 Timer。
-
Timer 触发后(自动或者手动调用
.fire())后,在停止计时,或者不再需要运行计时器时,需要手动销毁。 -
设置 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。
可用于判断重复运行的计时器是否还在运行。