在SwiftUI
中,TaskGroup
是一种处理并发任务的工具,特别适用于需要并发执行多个独立任务并在它们都完成后进行进一步处理的场景。TaskGroup
提供了一种结构化并发的方法,使得并行任务的启动、管理和结果收集变得更加简便和安全。
一、TaskGroup的基本概念
TaskGroup
是 Swift
并发系统的一部分,它允许创建一组并行执行的任务,并在所有任务完成后进行后续操作。使用 TaskGroup
时,可以:
- 向组中添加多个并行任务。
- 等待所有任务完成,并收集它们的结果。
- 在任务执行过程中动态添加新的任务。
二、TaskGroup的基本用法
下面是使用 TaskGroup
的基本步骤:
- 创建一个
TaskGroup
实例。 - 向
TaskGroup
中添加任务。 - 等待所有任务完成,并收集任务结果。
创建 TaskGroup
的方法主要有两种:withTaskGroup
和 withThrowingTaskGroup
withTaskGroup
withTaskGroup
是用于并行执行一组任务的结构。它允许我们启动多个子任务,并在所有子任务完成后汇总结果。它的主要特点是它不会抛出错误。
class TaskGroupViewModel: ObservableObject {
@Published var images: [UIImage] = []
private var urlStrings = [
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300",
"https://picsum.photos/300"
]
func fetchImageWithTaskGroup() async {
await withTaskGroup(of: UIImage?.self) {
group in
for urlString in urlStrings {
group.addTask {
try? await self.fetchImage(urlString: urlString)
}
}
for await image in group {
if let image {
images.append(image)
}
}