对于我正在处理的部分应用程序涉及一系列存储在对象数组中的计时器。理想情况下,我想遍历此数组,获取计时器的持续时间并继续倒计时。计时器完成后,转到阵列中的下一个项目并重复该过程
for(index, content) in enumerate timerList{
doneTimer = NSTimer.scheduledTimerWithTimeInterval(timerList[index].duration, target: self, selector: Selector("finished:"), userInfo: nil, repeats: false)
}
func finished(timer : NSTimer){
//do whatever and tell the loop to get the next item?
}
将这个for循环“保持”的最佳方法是什么,直到计时器结束才能进入数组中的下一个项目?
答案 0 :(得分:1)
在任何类型的GUI应用程序中,一个基本规则是你永远不想"暂停"或者"停止"或者"等等。"相反,你想要做的是启动一个稍后会完成的操作,返回到GUI,然后当该操作完成时,从你离开的地方开始。
在您的问题的上下文中,您似乎正在尝试做的是找到最近的计时器,启动它,在GUI中显示一些内容,然后在计时器触发之前不做任何事情。
考虑到这一点,您要采用的基本模型是找到最早的计时器,启动计时器,在GUI中显示某些内容,然后返回系统。当该计时器触发时,您可以重复该过程。
你原来的问题含糊不清,你最终会想到的是:
class TimerController {
var timers = [Timer]()
var runningTimer : NSTimer?
var countDownDisplay : UILabel?
class Timer {
let fireDate : NSDate
init(fireDate:NSDate) {
self.fireDate = fireDate
}
}
// given an array of NSTimer, find the earliest one to fire
func findEarliestTimer() -> Timer? {
return timers.sorted( { return $0.fireDate.timeIntervalSince1970 < $1.fireDate.timeIntervalSince1970 } ).first
}
func scheduleEarliestTimer() {
runningTimer?.invalidate()
runningTimer = nil
if let timer = findEarliestTimer() {
let duration = min(1.0, timer.fireDate.timeIntervalSinceNow)
runningTimer = NSTimer.scheduledTimerWithTimeInterval(duration, target: self, selector: "finish", userInfo: timer, repeats: false)
}
}
func finish(nstimer:NSTimer) {
let timer = nstimer.userInfo as Timer
// update the gui countdown
self.countDownDisplay?.text = "\(floor(timer.fireDate.timeIntervalSinceNow))"
// remove timer
timers = timers.filter { $0 !== timer }
// schedule the next timer
self.scheduleEarliestTimer()
}
}
请注意,当计时器熄灭而不是持续时间时,我使用NSDate来保持,因为&#34;持续时间&#34;只有在知道起点时才有意义。如果您希望连续触发一系列具有固定持续时间的操作,请根据需要进行修改。
由于您想要显示某种倒计时,因此您需要修改NSTimer,以便每次触发,直到适当的时间,每次触发更新倒计时。