斯威夫特'While'声明冻结iOS模拟器



我是编程新手,以前没有在我的应用程序中使用过'while'语句。我有一个cocoapod,它正在动画一个循环计时器图形。当它完成动画时,它设置一个didFinish BOOL值为true。我能够成功地检查这个变量,但是当我告诉我的应用程序将我的一个按钮标签设置为特定的文本'而' didFinish为false时,它会冻结我的应用程序。

//start the timer and change the label to "Reset"
else {
    brewingTimer.start()
    buttonSelect = 1
    startTimer.setTitle("Reset", forState: .Selected)
    //Start the circle counter graphic
    circleCounterOuter.startWithSeconds(5)
    circleCounterInner.startWithSeconds(2)
    while circleCounterInner.didFinish == false {
        startTimer.setTitle("Reset!", forState: .Selected)
    }
    startTimer.setTitle("Ok!", forState: .Selected)
}

当我点击"开始"时,应用程序就冻结了。当在我的while循环中为调试程序设置一个断点时,应用程序似乎在循环我的语句,因为我可以点击"跳过",因为它在循环"while循环"。但是当我在调试时,我当然看不到我的动画在屏幕上运行,所以我不确定到底发生了什么导致缓慢的模拟。

你的代码阻塞了主线程。

这段代码正忙着一遍又一遍地执行:

while circleCounterInner.didFinish == false {
    startTimer.setTitle("Reset!", forState: .Selected)
}

同时,主线程上没有其他东西可以做任何事情(比如更新文本或响应触摸事件),所以你的应用程序看起来是冻结的。

尝试不同的模式。例如,在长时间运行的工作开始时设置startTimer标签。然后,在另一种方法中,当工作完成时更新按钮。

您可能需要仔细阅读委托通知设计模式,它们通常用于这种情况。

最新更新