我有多个 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
无效。所以你用一个 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 |