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

时间:2014-08-03 04:05:35

标签: while-loop swift control-flow

我是编程新手,之前我的应用中没有使用过'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循环中为de-bugger设置一个断点时,应用程序似乎在我的语句中循环,因为我可以点击“跳过”,因为它循环通过'while-loop'。但是当我解决问题的时候,我当然看不到我的动画在屏幕上运行,所以我不确定实际发生了什么导致模拟迟缓。

1 个答案:

答案 0 :(得分:5)

您的代码会阻止主线程。

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

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

同时,主线程上的任何其他内容都无法执行任何操作(例如更新文本或响应触摸事件),因此您的应用似乎已被冻结。

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

您可能需要阅读委派通知设计模式,这些模式通常用于此类情况。