有没有一种方法可以取消DispatchQueue parallelPerform操作?

时间:2019-06-04 18:12:28

标签: swift macos grand-central-dispatch

有没有一种方法可以停止并发执行操作?

let count = arr.count
let group = DispatchGroup()
group.enter()
DispatchQueue.concurrentPerform(iterations: count, execute: { i in
    if stop { group.leave(); return }  // Crashes with EXC_BAD_INSTRUCTION
    // ..
})
group.wait()

经过几次迭代后,此崩溃以EXC_BAD_INSTRUCTION崩溃。似乎group.leave()没有退出操作。如何退出取消操作?基本上,我想做的是并发循环一个数组,并在满足某些条件时中断它,而不使用Objective-C桥来使用并发枚举。

1 个答案:

答案 0 :(得分:1)

DispatchQueue.concurrentPerform导致该块执行指定的次数,并等待所有迭代完成。没有办法防止这种情况。 (如果目标队列是并发队列,则这些块并行运行。)

当然,如果满足某些条件,每个工作项都可以“提前归还”,但这不会影响其他工作项。

您的代码崩溃的原因是,leave()在调度组上的调用次数比enter()还要多。