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
相关产品推荐
相关产品推荐

