只要前一个功能完成,如何依次调用多个功能

Dav*_*Irv 0 grand-central-dispatch ios swift

我试图依次调用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()
}
Run Code Online (Sandbox Code Playgroud)

Fay*_*yer 6

你可以用 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
    }
}
Run Code Online (Sandbox Code Playgroud)