ios - 如何使计时器在 swift 中与循环一起工作?

标签 ios loops swift2 nstimer

我有多个 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 循环不同的线程上运行?

最佳答案

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

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

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

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

相关文章:

ios - AVPlayer Fairplay HLS 不会在视频暂停时停止音频播放

ios - 如何在 iOS 中将 UITextView 的最大高度增加到 10000 以上?

ios - 如何获取 UISwitch 的值?

python - readline 与 for 循环问题

javascript - 在循环外访问循环内的所有变量

ios - 在 Swift 3.0 中转义闭包内改变自身(结构/枚举)

ios - App Transport Security 已阻止解析文件... Swift 2 错误

ios - 在 iOS 上禁用来自 VoiceOver 的 “…misspelled” 消息

c++ - 如何在循环外重新输入变量

ios - 为什么我的 GPA Double 值在 Swift 中不能正常工作?