如何在 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() 函式來終止計時器。為了防止計時器佔用資源並降低應用程式的功能,務必記住在完成使用計時器後將其停止。