如何让计时器在swift中使用循环?

时间:2016-01-22 23:03:15

标签: ios loops swift2 nstimer

我有多个视图,每个视图都与自己的计时器相关联。但是,每次只有一个视图正在运行。我正在访问for ... in循环中的每个视图,如果上一个视图中的前一个计时器已停止,我在选择器方法中失效,我想为下一个视图激活时间。

代码如下所示:

var timer = NSTimer() 
let timeInterval:NSTimeInterval = 1
var views = [TimerView]()
var timeCountDown: NSTimeInterval = 0

override func viewDidLoad() {
//viewDidLoad create the necessary UIView and fill the views array then pass them to a call to startTimer: 
startTimer(views)
}

//startTimer function create the countdown timer
func startTimer(timerViews: [TimerView]){
        for timerView in timerViews {

            if !timer.valid { // a view with its associated timer start only when the previous timer has run its course and is invalidated 
                //creating a timer to associate with the current view
                timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval,
                    target: self,
                    selector: "timerDidEnd:",
                    userInfo: timerView,
                    repeats: true) 

            }

    }
}

//Callback function
func timerDidEnd(timer: NSTimer){

    let timerView = timer.userInfo as! TimerView

    timeCountDown = timeCountDown - timeInterval

    timerView.timeLabel.text = timeToString(timeCountDown)

    timerView.curValue = CGFloat(timeCountDown)

    if timeCount <= 0.0 {

        resetTimeCount()
    }
}

func timeToString(time:NSTimeInterval) -> String {
    let minutes = Int(time) / 60
    let seconds = time - Double(minutes) * 60
    return String(format:"%02i:%02i",minutes,Int(seconds))
}

func resetTimeCount(){
    timer.invalidate()
}

对于三个视图的一些打印调试,我得到了这个输出:&#34;运行for循环&#34;,&#34;通过for循环调用#1;&#34;调用计时器&#34 #34;,&#34;通过for循环呼叫视图#2&#34;,&#34;通过for循环呼叫视图#3&#34;,&#34;倒计时开始&#34; ...这是仅在for循环结束后开始的倒计时。

我遇到的问题是第一个计时器在for循环调用视图数组中的所有视图时运行。如何让for循环等待定时器在迭代到下一个视图之前失效?

我想要实现的是:第一个视图开始倒计时;当倒计时完成后,第二次出现并进行倒计时。然后第三个视图带有新的倒计时,依此类推,直到最后一个视图。但看起来我的代码中的for循环在与集合中第一个视图关联的第一个计时器实际启动之前完成循环

感谢

编辑:我想知道计时器是否在与for循环不同的线程上运行?

1 个答案:

答案 0 :(得分:1)

您的代码存在逻辑问题。看起来你有一个单一的实例变量timer。您的for循环开始,并且在第一次传递时,大概timer无效。因此,您使用 IS 有效的新计时器覆盖它。现在,在第二次遍历timerViews数组时,检查相同的共享timer实例变量,但这次(以及随后的所有时间)timer都是有效的,所以如果声明没有触发。

如果您真的想为每个视图分别设置一个计时器,那么您需要存储所有这些计时器。一种方法是使用与数组timerViews一起的定时器数组。或者您可以创建一个元组数组,其中每个元素包含一个视图及其相关的计时器。

退出问题,为什么你想为每个字段分别设置一个计时器?为什么不使用单个计时器,每次触发时,循环遍历字段数组并确定每个计时器需要做什么?您可以拥有一组结构,其中包含对您的视图的引用以及状态信息,以便您的循环决定如何处理每个结构。