如何在 Swift 中使用 Timer(以前称为 NSTimer)?


您可以使用 Swift 中的 Timer 类来创建一个计时器,该计时器可以以指定的间隔重复执行方法。您可以实现计时器来解决不同的问题。您可以在 Swift 中安排可重复和不可重复的计时器。

Swift 中的计时器可用于执行各种任务,例如

  • 在指定的时间间隔内执行特定操作或代码块的过程,例如更新显示或更改标签的内容,或执行任何其他 UI 操作。

  • 发送提醒或建立将在特定日期和时间启动的后台活动。计时器使此过程在 iOS 应用中非常方便。

  • 频繁调用方法或代码块以创建动画或游戏循环,同时更新屏幕上对象的状况。

  • 通过实现计时器来递减计数器并在倒计时接近零时更新标签或显示警报,可以实现倒计时计时器。

  • 在开始任务之前建立计时器,在任务完成后停止它,然后计算时间间隔以确定它花费了多长时间。

  • 控制代码的运行方式,例如,当计时器关闭时暂停或终止活动,或者在经过一定时间后启动事件。

  • 执行后台操作,例如从服务器检索信息或更改对象的状况。

这些只是 Swift 中计时器可以执行的一些示例,可能性实际上是无限的。

重复计时器与非重复计时器

重复计时器和非重复计时器是 Swift 中两种类型的计时器,具有不同的应用。

重复计时器是一个计时器,它会以指定的时间间隔重复调用方法或代码块。可以通过将 repeats 参数设置为 true,使用 Timer.scheduledTimer(withTimeInterval:repeats:block:) 方法创建重复计时器。

示例

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.")
}

刷新视图或更改标签内容是重复计时器可以受益的两项重复任务的示例。非重复计时器对于只需要执行一次的任务很有用,例如设置提醒或在经过一定时间后启动事件。

注意 - 当您不再需要计时器时,应将其失效。这是因为它将继续执行代码并消耗资源。

如何设置重复计时器?

您可以使用 Timer 类在 Swift 中安排重复任务。

示例

以下是如何安排每 5 秒运行一次并在控制台上打印“timer has executed”的任务的示例:

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 方法调用的方法,该方法具有其目标对象。

我们如何使用计时器发送消息?

您可以通过使用 Timer 类的 userInfo 属性在 Swift 中使用计时器发送 userInfo。userInfo 属性是一个可选属性,可以保存您想要传递给计时器执行的代码块的任何类型的数据。

示例

以下是如何将消息作为 user Info 传递给计时器的示例:

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"]

我们如何停止重复计时器?

您可以使用 Timer 类的 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 计时器是计划和在特定间隔或日期执行任务的实用工具。Timer 类简化了创建重复和非重复计时器的过程,并且 userInfo 属性使您可以向包含计时器的代码块提供任何类型的数据。使用 Timer 类的 invalidate() 函数停止计时器。

您可以通过调用 Timer 类的 invalidate() 函数来终止计时器。为了防止计时器占用资源并降低应用程序的功能,务必记住在完成使用计时器后将其停止。

更新于:2023年2月28日

2K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告