2017-09-04 354 views
0

我正在開發一個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") 
     } 
    } 
} 
+1

的可能的複製[如何停止的NSTimer(https://stackoverflow.com/questions/3509012/how-to-stop-nstimer) – the4kman

+0

有什麼解決辦法我正在尋找避免,使計時器無效。它會使這個定時器不可用。 –

+0

每次你想創建一個新的定時器,檢查存儲在'buttonTimer'中的定時器是否已經使用'isValid'失效。如果它已經失效,則創建一個新的,否則使用當前的。 – Sweeper

回答

0

像往常一樣,答案是很簡單的。

如果計時器被聲明爲弱VAR,而不是僅僅VAR,只有微弱的實例將失效。因此,代碼應該是:

weak var buttonTimer: Timer? 
var buttonWasHeld: Bool = false 

func didUpdateModule() { 
    (...) 
     else { 
      // This will only invalidate the current running timer, 
      // not the whole variable :) 
      self.buttonTimer.invalidate 
      // I removed buttonWasHeld, it's not necessary anymore ;) 
      print("Button was released") 
     } 
    } 
} 
相關問題