我想構建一個應用程式,用戶在計時器后連續鍛煉。他可以決定定時器的 nb 和每個定時器的值。它適用于一個計時器,但是當我有多個計時器時,我想以串行模式觸發它們(觸發 timer1 并且僅在完成觸發 timer2 時,等等)。這里的代碼和我看到的是,在前一個結束之前,計時器一個接一個地異步觸發。我花了很多時間尋找一種簡單的編碼方法(我不確定是否需要同步佇列)。我檢查了很多問題,但找不到類似的答案。任何線索如何做到這一點?
@IBOutlet weak var timerLabel: UILabel!
var timer = Timer()
var myTimers = [5, 10, 8]
var myTimeCheck = 0
var seconds = 0
@IBAction func launchTimersPressed(_ sender: UIButton) {
for myTime in myTimers {
let queue = DispatchQueue(label:"com.queue.serial")
queue.sync {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.updateChrono), userInfo: nil, repeats: true)
print ("myTime = \(myTime)")
myTimeCheck = myTime
}
}
}
@objc func updateChrono() {
seconds = 1
timerLabel.text = "\(seconds)"
// checking if we arrive at end of time
print("seconds and myTime: \(seconds) and \(myTimeCheck) ")
if seconds == myTimeCheck {
timer.invalidate()
return // to move out
}
}
uj5u.com熱心網友回復:
不要嘗試在同步佇列中運行計時器。這很愚蠢。
看起來你所有的計時器每秒都會觸發一次,并且總是呼叫同一個目標。所以只需要一個持續運行的計時器。這將是一個“檢查當前鍛煉的狀態”計時器。
讓一個 var 保存一個 Doubles 陣列,指示每個練習的秒數。更好的是,有一組表示練習的結構。
當用戶開始練習時,從陣列中洗掉其結構并將其保存在變數 currentExercise 中。
當用戶開始一個特定的練習時,還要計算一個exerciseCompletedTime TimeInterval.
每次您的每秒一次的計時器觸發時,請查看當前時間是否 ≥ exerciseCompletedTime。如果是,則將該練習標記為已完成,從練習陣列中洗掉下一個練習結構,將其設定為當前練習,并計算一個新的exerciseCompletedTime.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/453806.html
