完成处理程序不工作(所有任务同时执行)

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)
    }
}