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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:25:34