完成处理程序不工作(所有任务同时执行)
Completion handler not working (all tasks are executed at the same time)
我有多个标签,我希望它们一个接一个地制作动画。所以我构建了一个完成处理程序,它应该在前一个任务完成后执行下一个任务。 (firstTask -> secondTask -> thirdTask -> fourthTask 在最后。)
但是由于某种原因所有的动画都是同时执行的。我做错了什么?
func firstTask(completion: (_ success: Bool) -> Void) {
UIView.transition(with: labelOne,
duration: 1,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.labelOne.text = arrayOne[GenOne]
}, completion: nil)
completion(true)
}
// two more tasks in between just like the firstTask func …
func fourthTask() {
UIView.transition(with: labelFour,
duration: 1,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.labelFour.text = arrayFour[GenFour]
}, completion: nil)
}
完成处理程序:
firstTask { (success) -> Void in
if success {
secondTask { (success2) -> Void in
if success2 {
thirdTask { (success3) -> Void in
if success3 {
fourthTask()
}
}
}
}
}
}
当您使用完成处理程序时,您需要在编写函数的位置分配变量,以便在调用它时可以使用它。例如:
func changeLabel(completion: (Bool) -> Void)) {
//insert whatever you want the function do
if (whateverYouWantedToHappenCompletes) {
completion(true)
} else {
completion(false)
}
}
changeLabel { (success) in
//now you can use the success parameter
}
如果您无法解决这个问题,请查看一些有关如何使用完成处理程序的视频,或者另一个有效的选择是使用 UIView.animate
下的内置完成处理程序
你需要执行你的完成块,当动画完成时,发生在动画的完成块上
func firstTask(completion: @escaping ((_ success: Bool) -> Void)) {
UIView.transition(with: randomOne, duration: 1, options: .transitionCrossDissolve, animations: {
self?.randomOne.text = location[RandomWordGenOne]
}) { (finished) in
completion(true)
}
}
我有多个标签,我希望它们一个接一个地制作动画。所以我构建了一个完成处理程序,它应该在前一个任务完成后执行下一个任务。 (firstTask -> secondTask -> thirdTask -> fourthTask 在最后。)
但是由于某种原因所有的动画都是同时执行的。我做错了什么?
func firstTask(completion: (_ success: Bool) -> Void) {
UIView.transition(with: labelOne,
duration: 1,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.labelOne.text = arrayOne[GenOne]
}, completion: nil)
completion(true)
}
// two more tasks in between just like the firstTask func …
func fourthTask() {
UIView.transition(with: labelFour,
duration: 1,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.labelFour.text = arrayFour[GenFour]
}, completion: nil)
}
完成处理程序:
firstTask { (success) -> Void in
if success {
secondTask { (success2) -> Void in
if success2 {
thirdTask { (success3) -> Void in
if success3 {
fourthTask()
}
}
}
}
}
}
当您使用完成处理程序时,您需要在编写函数的位置分配变量,以便在调用它时可以使用它。例如:
func changeLabel(completion: (Bool) -> Void)) {
//insert whatever you want the function do
if (whateverYouWantedToHappenCompletes) {
completion(true)
} else {
completion(false)
}
}
changeLabel { (success) in
//now you can use the success parameter
}
如果您无法解决这个问题,请查看一些有关如何使用完成处理程序的视频,或者另一个有效的选择是使用 UIView.animate
下的内置完成处理程序你需要执行你的完成块,当动画完成时,发生在动画的完成块上
func firstTask(completion: @escaping ((_ success: Bool) -> Void)) {
UIView.transition(with: randomOne, duration: 1, options: .transitionCrossDissolve, animations: {
self?.randomOne.text = location[RandomWordGenOne]
}) { (finished) in
completion(true)
}
}