Swift 4 - 线程1正在等待执行线程2

时间:2018-04-18 05:53:35

标签: ios iphone swift

我有这段代码:

func doSomethingFromJSON1() {
        print("1")
    }
    func doSomethingFromJSON2() {
        print("2")
    }
    func downloadImage() {
        print("3")
    }
    func waitingForNext() {
        print("4 - waiting")
    }
    func lastThread(){
        print("Last THREAD")
    }
    func finishFunction(){
        print("Finish")
    }
    func doItAll() {
        let dispatchGroup = DispatchGroup()

        dispatchGroup.enter()
        DispatchQueue.global().async {
            self.doSomethingFromJSON1()
            dispatchGroup.leave()
        }

        dispatchGroup.enter()
        DispatchQueue.global().async {
            self.doSomethingFromJSON2()
            dispatchGroup.leave()
        }

        dispatchGroup.enter()
        DispatchQueue.global().async {
            self.downloadImage()
            dispatchGroup.leave()
        }

        dispatchGroup.enter()
        DispatchQueue.global().async {
            self.waitingForNext()
            dispatchGroup.leave()
        }

        dispatchGroup.notify(queue: .global()) {
            self.finishFunction()
        }
    }

我希望线程“waitingForNext”等到执行“lastThread”线程,然后才启动它。

完成所有线程后,我想启动函数功能完成(现在就是这样)。

你怎么能这样做?

1 个答案:

答案 0 :(得分:0)

根据苹果官方文档:

  

DispatchSemaphore提供了一个有效的实现   传统的计数信号量,可用于控制访问   跨多个执行上下文的资源。

     

通过调用signal()方法增加信号量计数,并且   通过调用wait()方法或其中一个来减少信号量计数   指定超时的变体。

按照以下代码更新您的代码。这意味着在完成上一个任务时执行下一个任务。

func doItAll() {

    let semaPhore = DispatchSemaphore(value: 1)

    semaPhore.wait()
    DispatchQueue.global().async {
        doSomethingFromJSON1()
        semaPhore.signal()
    }

    semaPhore.wait()
    DispatchQueue.global().async {
        doSomethingFromJSON2()
        semaPhore.signal()
    }

    semaPhore.wait()
    DispatchQueue.global().async {
        downloadImage()
        semaPhore.signal()
    }

    semaPhore.wait()
    DispatchQueue.global().async {
        waitingForNext()
        semaPhore.signal()
    }
}