ios - 如何使计时器快速循环工作?
<p><p>我有多个 View ,每个 View 都与自己的计时器相关联。但是,每次只运行一个 View 。我在 for ... in 循环中访问每个 View ,如果前一个 View 中的前一个计时器已停止,我在选择器方法中使其无效,我想触发下一个 View 的时间。</p>
<p>代码如下所示:</p>
<pre><code>var timer = NSTimer()
let timeInterval:NSTimeInterval = 1
var views = ()
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: ){
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()
}
</code></pre>
<p>通过对三个 View 的一些打印调试,我得到以下输出:“运行 for 循环”、“通过 for 循环调用 View#1”、“调用计时器”、“通过 for 循环调用 View#2”、“通过 for loop","countdown starting"调用 View#3 ... 也就是说,只有在 for 循环终止后才开始倒计时。</p>
<p>我遇到的问题是第一个计时器在 for 循环调用我的 View 数组中的所有 View 时运行。如何让 for 循环等待计时器失效,然后再迭代到下一个 View ?</p>
<p>我想要实现的是:第一个 View 开始倒计时;当倒计时结束时,会出现一秒钟并运行倒计时。然后是带有新倒计时的第三个 View ,依此类推,直到最后一个 View 。但看起来我的代码中的 for 循环在与集合中的第一个 View 关联的第一个计时器实际开始之前完成循环</p>
<p>谢谢</p>
<p>编辑:我想知道计时器是否没有在与 for 循环不同的线程上运行?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>您的代码存在逻辑问题。看起来您有一个实例变量 <code>timer</code>。您的 for 循环开始,并且在第一次通过时,可能 <code>timer</code> 无效。所以你用一个 <strong>IS</strong> 有效的新计时器覆盖它。现在在第二次通过 <code>timerViews</code> 数组时,您检查相同的共享 <code>timer</code> 实例变量,但这次(以及所有后续时间)<code>timer</code> 是有效的,所以 if 语句的主体不会触发。</p>
<p>如果您真的想要为每个 View 设置一个单独的计时器,那么您将需要存储所有这些计时器。一种方法是让一组计时器与您的数组 timerViews 一起使用。或者您可以创建一个元组数组,其中每个元素都包含一个 View 及其关联的计时器。 </p>
<p>但是,从您的问题退后一步,您为什么要为每个字段设置一个单独的计时器?为什么没有一个计时器,每次触发时,循环遍历字段数组并决定你需要对每个字段做什么?您可以拥有一个结构数组,其中包含对您的 View 的引用以及让您的循环决定如何处理每个 View 的状态信息。</p></p>
<p style="font-size: 20px;">关于ios - 如何使计时器快速循环工作?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/34957394/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/34957394/
</a>
</p>
页:
[1]