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

Swift 4中3个线程的同步实现:多线程完成后执行收尾函数

如何等待多线程任务全部完成后执行收尾函数?

在Swift中,要实现让thread1、thread2、thread3这三个异步任务全部执行完毕后再调用finishFunction,最常用且简洁的方案是使用DispatchGroup,下面是具体的改造方法:

方案一:使用DispatchGroup

DispatchGroup的核心逻辑是给每个任务标记“进入”和“离开”,当所有标记的任务都“离开”后,就会触发我们指定的收尾操作。

修改后的代码示例:

// 创建一个DispatchGroup实例
let taskGroup = DispatchGroup()

func thread1() {
    taskGroup.enter() // 标记任务开始
    DispatchQueue.global().async {
        // 执行从JSON获取数据的操作
        // ...
        
        taskGroup.leave() // 标记任务完成,必须确保在操作真正结束时调用
    }
}

func thread2() {
    taskGroup.enter()
    DispatchQueue.global().async {
        // 执行从JSON获取数据的操作
        // ...
        
        taskGroup.leave()
    }
}

func thread3() {
    taskGroup.enter()
    DispatchQueue.global().async {
        // 执行图片下载操作
        // 比如用URLSession下载的话,要在下载完成的闭包里调用leave
        // ...
        
        taskGroup.leave()
    }
}

func finishFunction() {
    print("Finish")
}

// 启动所有任务
thread1()
thread2()
thread3()

// 监听所有任务完成的事件,这里可以指定收尾操作执行的队列(比如主线程)
taskGroup.notify(queue: DispatchQueue.main) {
    finishFunction()
}

需要注意的细节:

  • enter()和leave()必须成对出现,否则会导致group永远等待或者程序崩溃
  • 如果你的异步操作是带回调的(比如网络请求的闭包),一定要把leave()放在回调的末尾,确保任务真正完成后再标记离开

方案二:使用OperationQueue

如果你更倾向于用Operation来管理任务,也可以用OperationQueue实现,这种方式适合更复杂的任务依赖场景:

let operationQueue = OperationQueue()

// 包装每个任务为BlockOperation
let op1 = BlockOperation {
    // thread1的操作逻辑
    // ...
}

let op2 = BlockOperation {
    // thread2的操作逻辑
    // ...
}

let op3 = BlockOperation {
    // thread3的操作逻辑
    // ...
}

// 创建收尾Operation,依赖于前三个任务完成
let finishOp = BlockOperation {
    finishFunction()
}
finishOp.addDependency(op1)
finishOp.addDependency(op2)
finishOp.addDependency(op3)

// 添加所有任务到队列
operationQueue.addOperations([op1, op2, op3, finishOp], waitUntilFinished: false)

内容的提问来源于stack exchange,提问作者Łukasz Betta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:26:25