Swift循环中实现异步并行执行(类似JS Promise.all)
Swift 实现类似 JavaScript
Promise.all 的并行异步调用 你的原代码是串行执行每个异步任务,每处理一个friend都要等待上一个createFriendResult完成。要实现并行执行,有几种常用方式:
方式1:使用 TaskGroup(推荐,灵活可控)
TaskGroup 是 Swift 并发模型中处理批量异步任务的标准方式,能同时启动所有任务并收集结果,行为和 Promise.all 一致:
let jsFriendlyFriends: [JSObject] = await withTaskGroup(of: JSObject.self) { group in // 为每个friend启动异步任务 for friend in friends { group.addTask { await FriendsPlugin.createFriendResult(friend) } } // 收集所有任务的返回结果 var results = [JSObject]() for await result in group { results.append(result) } return results }
如果异步方法可能抛出错误,改用 withThrowingTaskGroup,它会在第一个任务抛出错误时终止所有任务,和 Promise.all 的错误行为完全对齐。
方式2:利用 Task 批量创建并行任务
如果不需要精细控制任务组,也可以直接为每个friend创建独立的Task,再等待所有任务完成:
// 批量创建并行任务 let tasks = friends.map { friend in Task { await FriendsPlugin.createFriendResult(friend) } } // 等待所有任务完成并汇总结果 let jsFriendlyFriends = await tasks.map { await $0.value }
这种写法更简洁,本质和 TaskGroup 一样,都是让所有异步任务同时执行,最后统一等待结果。
为什么原代码是串行的?
你原来的for循环中,每次调用await FriendsPlugin.createFriendResult(friend)都会暂停当前任务,直到这个异步方法完成才会进入下一次循环,因此是串行执行,无法利用并行提升效率。
内容的提问来源于stack exchange,提问作者mikesol
相关产品推荐
相关产品推荐

