语境
假设我想使用SWIFT并发在后台下载300张图片.我想要两样东西:
- 尽可能多的平行.
- 我的调用者在下载图像时接收每个图像,而不是等待所有图像都完成.
方法:
TaskGroup
有many advantages:伟大的并行性、非常廉价的子任务和取消.但它不会返回,直到所有300个子任务都完成.
AsyncStream
可以让我在下载时返回图片,但它本身没有并行性--下载是一次一个,按顺序进行的.
问题:
我想做的是用AsyncStream
来包装一个TaskGroup
,就像这样:
let stream = AsyncStream(NSImage.self) { continuation in
_ = await withTaskGroup(of: NSImage.self, returning: [NSImage].self) { taskGroup in
let imageURLs: [URL] = ... // array of 300 URLs to download
for imageURL in imageURLs {
taskGroup.addTask { await downloadImage(url: imageURL) }
}
for await result in taskGroup {
continuation.yield(result)
}
continuation.finish()
return []
}
}
但AsyncStream
不能接受async
的收盘.那么,使用SWIFT并发实现这一行为的最佳方式是什么?