菜鸟教程小白 发表于 2022-12-13 13:39:23

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: &#34;timerDidEnd:&#34;,
                  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 &lt;= 0.0 {

      resetTimeCount()
    }
}

func timeToString(time:NSTimeInterval) -&gt; String {
    let minutes = Int(time) / 60
    let seconds = time - Double(minutes) * 60
    return String(format:&#34;%02i:%02i&#34;,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]
查看完整版本: ios - 如何使计时器快速循环工作?