您可以使用任务组。请参见The Swift Programming Language: Concurrency中的Tasks and Task Groups部分(这似乎是您得到示例的地方)。
可以使用withTaskGroup(of:returning:body:)
创建一个任务组来并行运行任务,然后在结束时汇总所有结果。
例如,以下是一个示例,它创建返回“name”和“image”的元组的子任务,并将组合的字典返回这些名称字符串与其相关图像值:
func downloadImages(names: [String]) async -> [String: UIImage] {
await withTaskGroup(
of: (String, UIImage).self,
returning: [String: UIImage].self
) { [self] group in
for name in names {
group.addTask { await (name, downloadPhoto(named: name)) }
}
var images: [String: UIImage] = [:]
for await result in group {
images[result.0] = result.1
}
return images
}
}
或者更简洁的说:
func downloadImages(names: [String]) async -> [String: UIImage] {
await withTaskGroup(of: (String, UIImage).self) { [self] group in
for name in names {
group.addTask { await (name, downloadPhoto(named: name)) }
}
return await group.reduce(into: [:]) { $0[$1.0] = $1.1 }
}
}
它们并行运行:
但你可以从结果字典中提取它们:
let stooges = ["moe", "larry", "curly"]
let images = await downloadImages(names: stooges)
imageView1.image = images["moe"]
imageView2.image = images["larry"]
imageView3.image = images["curly"]
或者,如果您想按照原始顺序对数组进行排序,只需从字典中构建一个数组即可:
func downloadImages(names: [String]) async -> [UIImage] {
await withTaskGroup(of: (String, UIImage).self) { [self] group in
for name in names {
group.addTask { await (name, downloadPhoto(named: name)) }
}
let dictionary = await group.reduce(into: [:]) { $0[$1.0] = $1.1 }
return names.compactMap { dictionary[$0] }
}
}