Swift 如何使用Timer(以前的NSTimer)
你可以在Swift中使用Timer类来创建一个可以在指定时间间隔内重复执行某个方法的计时器。你可以实现定时器来解决不同的问题。你可以在Swift中安排可重复和不可重复的定时器。
Swift中的定时器可以用来执行各种任务,比如说 −
- 在指定的时间间隔内执行特定的动作或代码块,如更新显示或改变标签的内容,或执行任何其他UI动作。
-
发送一个提醒或建立一个将在特定日期和时间启动的后台活动。计时器使这个过程在iOS应用程序中非常方便。
-
频繁地调用一个方法或代码块来创建一个动画或游戏循环,同时更新屏幕上对象的状态。
-
通过实现一个计时器来递减一个计数器,并在倒计时接近零时更新一个标签或显示一个警报,就可以实现一个倒计时计时器。
-
在开始一项任务前建立一个定时器,在任务完成后停止定时器,然后计算时间间隔以确定所花的时间。
-
控制代码的运行方式,例如,当计时器熄灭时暂停或终止一项活动,或在一定时间过去后启动一个事件。
-
执行后台操作,如从服务器上检索信息或改变对象的状态。
这些只是Swift中可以用计时器做的几个例子,可能性几乎是无穷的。
重复与非重复定时器
重复定时器和非重复定时器是Swift中两种类型的定时器,有不同的应用。
重复定时器是一个在指定时间间隔内重复调用一个方法或代码块的定时器。可以使用Timer.scheduledTimer(withTimeInterval:repeats:block:)方法,通过将repeats参数设置为true,来创建一个重复的计时器。
例子
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
// code to be executed every 1 second
print("A repeating timer has executed.")
}
非重复定时器通常被称为一次性定时器,在失效前只调用一个方法或代码块一次。通过将repeats参数设置为false,一个非重复的定时器可以使用与重复定时器相同的技术来构建。
例子
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { timer in
// code to be executed after 1 second
print("A repeating timer has executed.")
}
刷新视图或改变标签内容是重复性工作的两个例子,可以从重复性定时器中受益。非重复定时器对于只需要做一次的工作很有帮助,比如设置一个提醒或在一定时间过后启动一个事件。
注意 – 当你不再需要它时,你应该使准备时间失效。这是因为它将继续执行代码并消耗资源。
如何设置一个重复的计时器?
你可以在Swift中使用Timer类来安排一个重复的任务。
例子
下面是一个例子,说明如何安排一个每5秒运行一次的任务,并在控制台打印出 “定时器已执行 “的信息 —
import UIKit
class TestController: UIViewController {
private var timer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
// scheduling a timer in repeat mode after every 5 seconds.
self.timer = Timer.scheduledTimer(timeInterval: 5,
target: self,
selector: #selector(handleTimerExecution),
userInfo: nil,
repeats: true)
}
@objc private func handleTimerExecution() {
print("timer has executed")
}
}
handleTimerExecution()函数,可以通过@objc属性访问,是Objective-C的一个方便的功能。定时器类是Objective-C运行时的一个组件,因此也需要@objc标签。
你可以使用iOS的target-action功能来调用特定对象上的特定函数。我们把 “action “定义为被action方法调用的方法,它的目标是它应该被调用的对象。
我们怎样才能用定时器发送消息?
你可以通过使用定时器类的userInfo属性,在Swift中用定时器发送userInfo。userInfo属性是一个可选的属性,可以容纳任何你想传递给定时器执行的代码块的数据类型。
例子
下面是一个如何将消息作为用户信息传递给定时器的例子 —
import UIKit
class TestController: UIViewController {
private var timer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
let userInfo: [String: Any] = ["fullName": "Albert Martin", "age": 23, "country": "USA"]
// scheduling a timer in repeat mode after each 5 seconds.
self.timer = Timer.scheduledTimer(timeInterval: 5,
target: self,
selector: #selector(handleTimerExecution),
userInfo: userInfo,
repeats: true)
}
@objc private func handleTimerExecution(_ timer: Timer) {
if let userInfo = timer.userInfo as? [String: Any] {
print("User info: \(userInfo)")
// invalidate the timer after receiving the user info.
self.timer?.invalidate()
}
// here is a fallback to end the timer if userInfo is not found
}
}
输出
User info: ["fullName": "Albert Martin", "age": 23, "country": "USA"]
我们怎样才能停止一个重复的计时器?
你可以通过使用计时器类的 invalidate() 方法在 Swift 中停止一个重复的计时器。
invalidate()方法会停止定时器并释放其资源,因此它将不再执行与之相关的代码块。
例子
下面是一个如何停止一个重复定时器的例子
import UIKit
class TestController: UIViewController {
private var timer: Timer?
private var timerCurrentCount = 0
override func viewDidLoad() {
super.viewDidLoad()
// scheduling a timer in repeat mode after every 5 seconds.
self.timer = Timer.scheduledTimer(timeInterval: 5,
target: self,
selector: #selector(handleTimerExecution),
userInfo: nil,
repeats: true)
}
@objc private func handleTimerExecution() {
// check for max execution count of timer.
if self.timerCurrentCount == 5 {
self.timer?.invalidate() // invalidate the timer
print("Timer invalidated")
} else {
print("Timer executed")
self.timerCurrentCount += 1
}
}
}
输出
Timer executed
Timer executed
Timer executed
Timer executed
Timer executed
Timer invalidated
关键是要理解,定时器所占用的内存不会被invalidate()方法立即释放。它将在系统认为合适的时候被释放。
此外,当你使用完定时器后,关闭它是一个很好的做法,以避免它占用资源和降低你的应用程序的功能。
总结
因此,Swift定时器是一个实用的工具,可以在一定的时间间隔或日期内计划和执行任务。计时器类使创建重复和不重复的计时器变得简单,而userInfo属性使你能够向包含计时器的代码块提供任何类型的数据。使用Timer类的invalidate()函数来中止一个定时器。
你可以通过调用Timer类的invalidate()函数终止一个定时器。为了防止定时器使用资源和降低你的应用程序的功能,关键是要记住在你用完后停止它。