OGeek|极客世界-中国程序员成长平台

标题: ios - 如何使计时器快速循环工作? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 13:39
标题: ios - 如何使计时器快速循环工作?

我有多个 View ,每个 View 都与自己的计时器相关联。但是,每次只运行一个 View 。我在 for ... in 循环中访问每个 View ,如果前一个 View 中的前一个计时器已停止,我在选择器方法中使其无效,我想触发下一个 View 的时间。

代码如下所示:

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()
}

通过对三个 View 的一些打印调试,我得到以下输出:“运行 for 循环”、“通过 for 循环调用 View #1”、“调用计时器”、“通过 for 循环调用 View #2”、“通过 for loop","countdown starting"调用 View #3 ... 也就是说,只有在 for 循环终止后才开始倒计时。

我遇到的问题是第一个计时器在 for 循环调用我的 View 数组中的所有 View 时运行。如何让 for 循环等待计时器失效,然后再迭代到下一个 View ?

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

谢谢

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



Best Answer-推荐答案


您的代码存在逻辑问题。看起来您有一个实例变量 timer。您的 for 循环开始,并且在第一次通过时,可能 timer 无效。所以你用一个 IS 有效的新计时器覆盖它。现在在第二次通过 timerViews 数组时,您检查相同的共享 timer 实例变量,但这次(以及所有后续时间)timer 是有效的,所以 if 语句的主体不会触发。

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

但是,从您的问题退后一步,您为什么要为每个字段设置一个单独的计时器?为什么没有一个计时器,每次触发时,循环遍历字段数组并决定你需要对每个字段做什么?您可以拥有一个结构数组,其中包含对您的 View 的引用以及让您的循环决定如何处理每个 View 的状态信息。

关于ios - 如何使计时器快速循环工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34957394/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) Powered by Discuz! X3.4