我正在開發一個iOS應用程序,使用藍牙設備和一個與iPad通信的按鈕。基本上我希望當按鈕保持3秒或更長時間時發出幫助請求。如何在不破壞的情況下重啓或停止Swift中的Timer?
從我發現的所有文檔中,我找不到使其無效的方法來停止定時器,並使用invalidate()方法。從Apple's documentation:
運行循環然後刪除定時器(和強引用它不得不定時器),要麼只是在 無效() 方法返回之前或在稍後的某個點。 一旦無效,定時器對象不能重新使用。
所以在我的代碼的想法是,當按下按鈕時,布爾buttonWasHeld設置爲true和計時器被觸發。如果按鈕被釋放,buttonWasHeld被設置爲false,並且當定時器調用處理程序時,它知道該按鈕沒有被保持足夠長的時間。然後,如果在3秒內再次按下該按鈕,定時器將再次置位。
問題是:每個按鈕按下一個新的定時器,這意味着反覆按下按鈕也會發出幫助請求。而且,所有這些定時器都由同一個變量處理,所以我不能將它們分開。
有沒有辦法唯一地告訴什麼是最後創建的計時器?或者一個晦澀的方式來暫停/停止它?
這裏的控制此功能的一段代碼:
var buttonTimer: Timer?
var buttonWasHeld: Bool = false
func didUpdateModule() {
// gpioListener takes a handler to be called whenever a button is
// pressed or released. isPushed is a self-explanatory boolean.
self.controller.gpioListener() { isPushed in
if isPushed {
self.buttonWasHeld = true
self.buttonTimer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) { _ in
if self.buttonWasHeld {
// Issue a help request
self.delegate?.notifyDevice(message: .HELP)
print("Asking for help")
}
}
print("Button was pressed")
}
else {
self.buttonWasHeld = false
// Also tried "self.buttonTimer = nil" here. Didn't work
print("Button was released")
}
}
}
的可能的複製[如何停止的NSTimer(https://stackoverflow.com/questions/3509012/how-to-stop-nstimer) – the4kman
有什麼解決辦法我正在尋找避免,使計時器無效。它會使這個定時器不可用。 –
每次你想創建一個新的定時器,檢查存儲在'buttonTimer'中的定時器是否已經使用'isValid'失效。如果它已經失效,則創建一個新的,否則使用當前的。 – Sweeper