我想要构建一个应用程序,在这里,用户会在一个定时器后面进行一行练习。他可以决定计时器的nb和每个定时器的值。它对一个定时器很好,但是当我有多个定时器时,我想以串行模式(fire 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
}
}发布于 2022-03-30 12:53:00
不要尝试在同步队列中运行计时器。那太傻了。
看起来您的计时器每秒钟都会触发,并且总是调用相同的目标。所以,只要有一个定时器,不断地运行。它将是一个“检查当前练习的状态”计时器。
让var持有一个双倍数组,该数组指示每个练习的秒数。更好的是,有一组表示练习的结构。
当用户开始练习时,从数组中删除其结构,并将其保存在变量currentExercise中。
当用户开始特定的练习时,还计算一个exerciseCompletedTime TimeInterval。
每次您的每秒一次计时器启动,看看当前的时间是否是≥≥.如果是,将该练习标记为已完成,从练习数组中删除下一个练习结构,将其设置为当前练习,并计算一个新的exerciseCompletedTime。
https://stackoverflow.com/questions/71675503
复制相似问题