【问题标题】:Completion handler not working (all tasks are executed at the same time)完成处理程序不起作用(所有任务同时执行)
【发布时间】:2020-06-22 14:16:45
【问题描述】:

我有多个标签,我希望它们一个接一个地进行动画处理。所以我构建了一个完成处理程序,它应该在前一个任务完成后执行下一个任务。 (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()
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • 您正在使用每个函数中的completion(true) 立即调用完成处理程序

标签: ios swift xcode completion


【解决方案1】:

你需要执行你的完成块,当动画完成时,这发生在动画的完成块上

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

【讨论】:

    【解决方案2】:

    当您使用完成处理程序时,您需要将变量分配到您编写函数的位置,以便在调用它时可以使用它。例如:

        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 下的内置完成处理程序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多