如何检查多个并发线程何时完成?

时间:2017-05-10 12:37:42

标签: swift multithreading grand-central-dispatch

我的代码是这样的:

myArray.forEach { item in
   concurentOperation(item)
}

数组中的每个项目都经过并发操作函数,该函数在不同的线程中运行,我不确定究竟是哪个线程或多少线程,因为该函数来自第三方库并且不在我的控制之下。一旦所有操作完成,我需要一种方法来找出它。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

没有修改concurentOperation()这是不可用的,对不起......

用户@Scriptable的更新

下一个片段演示了为什么他的解决方案不起作用......

import PlaygroundSupport
import Dispatch

PlaygroundPage.current.needsIndefiniteExecution = true

let pq = DispatchQueue(label: "print", qos: .background)
func dprint(_ items: Any...) {
    pq.async {
        let r = items.map{ String(describing: $0) }.joined(separator: " ")
        print(r)
    }
}

func concurrentOperation<T>(item: T) { // dummy items
    DispatchQueue.global().async {
        // long time operation
        for i in 0..<10000 {
            _ = sin(Double(i))
        }
        dprint(item, "done")
    }
}



let myArray = [1,2,3,4,5,6,7,8,9,0]
let g = DispatchGroup()
myArray.forEach { (item) in
    DispatchQueue.global().async(group: g) {
        concurrentOperation(item: item)
    }
}
g.notify(queue: DispatchQueue.main) {
    dprint("all jobs done???")
}

更新2

不修改ConcurrentOperation()的代码

DispatchQueue.global().async(group: g) {
            concurrentOperation(item: item)
        }

输入调度组并立即离开,因为concurrentOperation是异步函数。如果它是同步的那么这个问题没有意义。