只要前一个完成,如何一个接一个地调用多个函数

时间:2018-02-17 17:42:21

标签: ios swift grand-central-dispatch

我试图按顺序调用3个函数,但每个函数都需要在下一个函数运行之前完成。每个函数都有一个完成处理程序,完成后调用另一个函数。在网上阅读了关于调度队列的批次之后我虽然这可能是接近它的最佳方式,但如果我理解它当然是正确的。当我运行我的代码时,每个函数都按顺序调用,但不是在前一个函数完成时调用。在第一个函数中,我从firebase下载图像,但第二个函数在图像下载之前被调用。我已经在我的代码中删除了细节,但这是我到目前为止所做的。

typealias COMPLETION = () -> ()

let functionOne_completion = {
    print("functionOne COMPLETED")
}

let functionTwo_completion = {
    print("functionTwo COMPLETED")
}

let functionThree_completion = {
    print("functionThree COMPLETED")
}



override func viewDidLoad() {
    super.viewDidLoad()


    let queue = DispatchQueue(label: "com.myApp.myQueue")

    queue.sync {

        functionOne(completion: functionOne_completion)

        functionTwo(completion: functionTwo_completion)

        functionThree(completion: functionThree_completion)

    }



func functionOne(completion: @escaping COMPLETION) {

    print("functionOne STARTED")
    completion()
}

func functionTwo(completion: @escaping COMPLETION) {

    print("functionTwo STARTED")
    completion()
}

func functionThree(completion: @escaping COMPLETION) {

    print("functionThree STARTED")
    completion()
}

2 个答案:

答案 0 :(得分:4)

您可以使用DispatchGroup

DispatchQueue.global().async {
    let dispatchGroup = DispatchGroup()

    dispatchGroup.enter()
    functionOne { dispatchGroup.leave() }
    dispatchGroup.wait() //Add reasonable timeout

    dispatchGroup.enter()
    functionTwo { dispatchGroup.leave() }
    dispatchGroup.wait()

    dispatchGroup.enter()
    functionThree { dispatchGroup.leave() }
    dispatchGroup.wait()

    dispatchGroup.notify(queue: .main) {
        //All tasks are completed
    }
}

答案 1 :(得分:2)

你需要在完成第一个函数时调用第二个函数。

类似的东西:

func first(_ completion : @escaping()->()){

   print("first")
   completion()
}

func second(_ completion : @escaping()->()){
   print("second")
}

func third(){
   print("third")
}

override func viewDidLoad(){

   ....
   first{
     self.second{
          self.third()
     }

   }
}

因此,当你的图像下载完成后,在你完成下载完成回调的完成块内,你应该调用你的第二个方法/块作为参数传递,然后调用你的第二个方法。