如何用Swift的async let并行执行两个不同类型的异步操作?
Swift中用async let并行执行不同类型异步操作的正确方式
当然可以用async let并行执行不同返回类型的异步操作,你代码里的问题是await try的语法错误,下面是正确的实现方式:
1. 基础async let写法
分别对每个async let任务进行错误处理和结果获取,或者合并为一行:
func getOptionsAndVariants() async throws { do { async let options: [ProductOption] = NetworkManager.sharedInstance.getProductOptions(product.id.description) async let variants: [ProductVariant] = NetworkManager.sharedInstance.getProductVariants(product.id) // 方式一:分别获取结果 let fetchedOptions = try await options let fetchedVariants = try await variants // 方式二:一行获取两个结果 // let (fetchedOptions, fetchedVariants) = try await (options, variants) // 这里处理拿到的options和variants } catch { // 捕获任意一个任务抛出的错误 print("请求失败:\(error.localizedDescription)") } }
2. TaskGroup实现方式
如果要用TaskGroup,只需指定能容纳两种结果的返回类型(比如可选元组),就能并行处理不同类型的任务:
func getOptionsAndVariants() async throws { let (options, variants) = try await withThrowingTaskGroup(of: ([ProductOption]?, [ProductVariant]?).self) { group in // 添加获取选项的任务 group.addTask { let options = try await NetworkManager.sharedInstance.getProductOptions(self.product.id.description) return (options, nil) } // 添加获取变体的任务 group.addTask { let variants = try await NetworkManager.sharedInstance.getProductVariants(self.product.id) return (nil, variants) } var fetchedOptions: [ProductOption]? var fetchedVariants: [ProductVariant]? // 遍历任务结果 for try await result in group { fetchedOptions = result.0 ?? fetchedOptions fetchedVariants = result.1 ?? fetchedVariants } // 确保两个结果都获取到 guard let options = fetchedOptions, let variants = fetchedVariants else { throw NSError(domain: "NetworkError", code: -1, userInfo: [NSLocalizedDescriptionKey: "未获取到完整数据"]) } return (options, variants) } // 处理最终拿到的options和variants }
关键说明
- async let天然支持不同返回类型的任务并行,只要正确使用
try await处理每个任务的结果和错误 - 任意一个异步任务抛出错误时,
try await会立即终止并抛出该错误,无需额外处理 - TaskGroup通过灵活的返回类型设计,同样能完美支持不同类型的异步任务并行执行
内容的提问来源于stack exchange,提问作者Kuba Gawecki
相关产品推荐
相关产品推荐

