如何以同步方式触发多个不同的定时器?

How to fire multiple different timers in a synchronous way?

我想构建一个应用程序,用户可以在其中按照计时器进行连续锻炼。他可以决定定时器的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
    }
}

不要在同步队列中尝试 运行 计时器。太傻了。

看起来你所有的计时器每秒都会触发,并且总是调用同一个目标。所以只需要一个持续 运行 的计时器。这将是一个“检查当前练习的状态”计时器。

让 var 保存一个 Double 数组,指示每个练习的秒数。更好的是,有一组表示练习的结构。

当用户开始练习时,从数组中删除它的结构并将其保存在变量 currentExercise 中。

当用户开始特定练习时,还计算 exerciseCompletedTime TimeInterval.

每次您的 once-a-second 计时器启动时,查看当前时间是否 ≥ exerciseCompletedTime。如果是,将该练习标记为已完成,从练习数组中删除下一个练习结构,将其设置为当前练习,并计算一个新的 exerciseCompletedTime.