我的代码是这样的:
myArray.forEach { item in
concurentOperation(item)
}
数组中的每个项目都经过并发操作函数,该函数在不同的线程中运行,我不确定究竟是哪个线程或多少线程,因为该函数来自第三方库并且不在我的控制之下。一旦所有操作完成,我需要一种方法来找出它。
我该怎么做?
答案 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是异步函数。如果它是同步的那么这个问题没有意义。