UIView.animate 执行代码的顺序
Order in which code is executed with UIView.animate
我的代码有问题,下面是一个简化版本。我希望在“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
...
这是因为 print("2")
在这段代码开始后大约 0.1-0.2 秒执行,但 print("1")
发生在 for 循环执行之后。
动画不与for循环同步执行。 print("2")
将在第二个动画期间发生,但到那时,for 循环已经完成并且 print("1")
已执行。
UIView.animate
运行s 在主线程上并且是异步的。因此,一旦调用该代码,它就会将其分派到 NEXT 运行 循环(在 this 函数终止之后,这意味着在整个 for 循环之后)。
换句话说,UIView.animate
调用本质上只是将其排队等待下一个 运行 循环。而 print("1")
语句仍然出现在当前的 运行 循环中。
然后动画块是运行,一旦动画块完成,完成块运行s。因此,就 CPU 处理而言,2 的打印稍后出现 WAAAAAY,这绝对是预期的行为。
调用UIView.animate
命令动画;它不会 执行 它。动画引擎将在稍后执行它。您正在将两个要执行的块 later 交给动画引擎,这意味着 after 您的所有代码都结束了(从技术上讲,它是下一个屏幕刷新帧出现,当前 CATransaction 被提交):
animations
代码块将 运行 在您的所有代码完成后,动画 开始 。
completion
块将在动画结束后运行(这就是"completion"的意思)。
我的代码有问题,下面是一个简化版本。我希望在“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
...
这是因为 print("2")
在这段代码开始后大约 0.1-0.2 秒执行,但 print("1")
发生在 for 循环执行之后。
动画不与for循环同步执行。 print("2")
将在第二个动画期间发生,但到那时,for 循环已经完成并且 print("1")
已执行。
UIView.animate
运行s 在主线程上并且是异步的。因此,一旦调用该代码,它就会将其分派到 NEXT 运行 循环(在 this 函数终止之后,这意味着在整个 for 循环之后)。
换句话说,UIView.animate
调用本质上只是将其排队等待下一个 运行 循环。而 print("1")
语句仍然出现在当前的 运行 循环中。
然后动画块是运行,一旦动画块完成,完成块运行s。因此,就 CPU 处理而言,2 的打印稍后出现 WAAAAAY,这绝对是预期的行为。
调用UIView.animate
命令动画;它不会 执行 它。动画引擎将在稍后执行它。您正在将两个要执行的块 later 交给动画引擎,这意味着 after 您的所有代码都结束了(从技术上讲,它是下一个屏幕刷新帧出现,当前 CATransaction 被提交):
animations
代码块将 运行 在您的所有代码完成后,动画 开始 。completion
块将在动画结束后运行(这就是"completion"的意思)。