我的代码有问题,下面的简化版本对此进行了说明。我希望在“ 1”之前打印“ 2”。但是,事实并非如此。
这与代码实际上没有从上到下运行有关吗?
if moveConclusion.patternDetected == true {
for i in 0...8 {
if pressedArray[i] {
self.panlButtons[i].backgroundColor = UIColor.clear
UIView.animate(withDuration: 0.1, animations:{
self.panlButtons[i].backgroundColor = self.correctColour
//self.panlButtons[i].transform = CGAffineTransform(rotationAngle: CGFloat.pi / -12)
}, completion: { finished in
UIView.animate(withDuration: 0.1, animations:{
self.panlButtons[i].backgroundColor = UIColor.clear
// self.panlButtons[i].transform = CGAffineTransform(rotationAngle: CGFloat.pi / 12)
print("2")
})
})
}
}
print("1")
}
输出:
1
2
2
2
...
答案 0 :(得分:3)
调用UIView.animate
命令动画;它不能执行它。动画引擎将在稍后执行它。您将向动画引擎交付两个要在以后执行的代码块,这意味着之后所有代码都结束了(从技术上讲,这是下一个屏幕刷新帧到来的时候)以及当前的CATransaction已提交):
animations
块将在您所有代码完成后运行,现在是动画开始的时候了。
completion
块将在动画结束之后运行(这就是“完成”的意思)。
答案 1 :(得分:0)
这是因为print("2")
在此代码开始后大约执行0.1-0.2秒,而print("1")
在for循环执行之后发生。
动画不能与for循环同步执行。 print("2")
将在第二个动画期间发生,但是到那时,for循环已完成,print("1")
已执行。
答案 2 :(得分:0)
UIView.animate
在主线程上运行,并且是异步的。因此,一旦调用该代码,它便将其分派到NEXT运行循环中(在此函数终止之后,即在整个for循环之后)。
换句话说,UIView.animate
调用实际上只是将其排队等待下一个运行循环。并且print("1")
语句仍出现在当前运行循环中。
然后运行动画块,并且一旦动画块完成,则完成块将运行。因此,就CPU处理而言,2的印刷版稍后会出现WAAAAAY,这绝对是预期的行为。