复杂流程下的Grand Central Dispatch:如何添加不依赖任务a的任务d
解决方案
其实你只需要调整下DispatchGroup的使用方式,把任务d也纳入到e等待的分组里就行,还能去掉不必要的group.wait()(毕竟阻塞线程可不是个好习惯)。具体代码如下:
let group = DispatchGroup() // 先处理任务a,它完成后再启动b和c a() { // a完成后启动b,加入分组跟踪 group.enter() b() { group.leave() } // 同样启动c,加入分组 group.enter() c() { group.leave() } } // 任务d不需要等a,直接启动并加入分组 group.enter() d() { group.leave() } // 当b、c、d全部完成时,在主线程触发e group.notify(queue: .main) { e() }
为啥这么写?
- 我们只需要一个
DispatchGroup来跟踪b、c、d的完成状态,因为e只需要等这三个任务都结束。 - 任务
a的回调里启动b和c,用enter()和leave()标记它们的开始和结束,让分组能准确跟踪状态。 - 任务
d不依赖a,所以直接在外部启动,同样加入到同一个分组里,这样它和a可以并行执行,节省时间。 - 最后用
group.notify确保所有依赖任务完成后,再在主线程执行e。
如果因为某些特殊场景,你确实需要保留group.wait()(比如在后台线程执行,不怕阻塞),也可以这么调整——不过记得让d提前启动,别浪费并行的机会:
let group = DispatchGroup() // 先启动d,加入分组,它不用等a group.enter() d() { group.leave() } // 等待a完成(这里会阻塞当前线程) group.enter() a() { group.leave() } group.wait() // a完成后启动b和c group.enter() b() { group.leave() } group.enter() c() { group.leave() } // 等b、c、d都完成后触发e group.notify(queue: .main) { e() }
这样d和a能同时跑,比等a完成再启动d效率高多了~
内容的提问来源于stack exchange,提问作者joshmori
相关产品推荐
相关产品推荐

