Swift中如何通过循环使用async let存储并行请求的异步变量
Swift 循环实现并发异步请求的正确方案
async let是编译期静态绑定的并发语法,仅支持固定数量的任务声明,无法在循环、map等动态闭包中创建后直接返回,因此你示例中在map里返回async let变量的写法无法编译通过。
下面是两种可正常运行、和async let效果完全一致的并行实现方案:
方案1:Task数组实现
写法简单直观,适合任务数量较少的场景:
// 批量创建并行任务,任务创建后会立刻启动执行 let tasks = photoNames.map { photo in Task { // 此处替换为你实际的downloadPhoto返回类型,没有抛错则去掉try try await downloadPhoto(named: photo) } } // 按顺序等待所有任务返回结果 var photos: [UIImage] = [] for task in tasks { // 没有抛错则去掉try let photo = try await task.value photos.append(photo) } show(photos)
方案2:TaskGroup实现
更适合任务数量较多的场景,系统调度效率更高,也支持更灵活的任务控制逻辑:
// downloadPhoto没有抛错则改为withTaskGroup,移除所有try关键字 let photos = try await withThrowingTaskGroup(of: UIImage.self) { group in for photo in photoNames { group.addTask { try await downloadPhoto(named: photo) } } // 按任务添加顺序收集结果,保证和photoNames顺序一致 var orderedPhotos: [UIImage] = [] for try await photo in group { orderedPhotos.append(photo) } return orderedPhotos } show(photos)
补充说明
- 两种方案均为真正的并行执行,所有下载任务会同时启动,不需要等待前一个任务完成才启动下一个,性能和你最初的固定async let写法完全一致
- 最终返回的photos顺序和输入的photoNames顺序完全匹配,不会因为单个任务完成快慢打乱排序
内容的提问来源于stack exchange,提问作者Pytan
相关产品推荐
相关产品推荐

