我有三个线程可以从互联网上下载数据。
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函数。如何做到这一点?
答案 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()中达到零。