在Swift 4中同步3个线程

时间:2018-04-17 20:27:44

标签: ios swift grand-central-dispatch

我有三个线程可以从互联网上下载数据。

func thread1() {
    DispatchQueue.global().async {
        // do something from json
    }
}

func thread2() {
    DispatchQueue.global().async {
        // do something from json
    }
}

func thread3() {
    DispatchQueue.global().async {
        // download img
    }
}


func finishFunction() {
    print("Finish")
}

我想在完成线程1,2和3之后启动finishFunction函数。如何做到这一点?

2 个答案:

答案 0 :(得分:6)

通常,您不会在sync / async次来电中包装功能正文。让函数执行它所做的事情会更好,然后让调用者可以灵活地将它们分配给他们想要的QoS,在他们想要的队列上,以及他们想要的任何其他标志。 / p>

func doSomethingFromJSON1() {}
func doSomethingFromJSON2() {}
func downloadImage() {}

func doItAll() {
    let dispatchGroup = DispatchGroup()

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

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

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

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

答案 1 :(得分:0)

我对Swift的深度一无所知,但我认为你依赖于GCD,而不是线程。因此,使用一个GCD信号量(计数3)并减少一次,操作结束。等待它在finishFunction()中达到零。