You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复杂流程下的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:36:16