【发布时间】:2022-01-05 00:30:15
【问题描述】:
在 WWDC 2021 视频中,Protect mutable state with Swift actors,他们提供了以下代码 sn-p:
actor ImageDownloader {
private var cache: [URL: Image] = [:]
func image(from url: URL) async throws -> Image? {
if let cached = cache[url] {
return cached
}
let image = try await downloadImage(from: url)
cache[url] = cache[url, default: image]
return cache[url]
}
func downloadImage(from url: URL) async throws -> Image { ... }
}
问题在于演员提供重入,因此cache[url, default: image] 参考有效地确保即使您由于某些比赛而执行重复请求,您至少在继续后检查演员的缓存,确保您获得相同的图像重复请求。
在那个视频中,他们say:
更好的解决方案是完全避免冗余下载。我们已将该解决方案放入与该视频相关的代码中。
但网站上没有与该视频相关的代码。那么,更好的解决方案是什么?
我了解演员重入的好处(如SE-0306 中所述)。例如,如果下载四个图像,一个不想禁止重入,失去下载的并发性。实际上,我们希望等待对特定图像的重复先前请求的结果(如果有),如果没有,则开始一个新的downloadImage。
【问题讨论】:
-
有什么地方可以投票给“StackOverflow 上最伟大的双重自我回答问题”?我觉得我应该标记这个问题,以便钻石版主可以将其作为示例发布给其他人。
-
在开发者应用的“代码”标签中查找
-
是的,正如 Rob Mayoff 在下面的回答中指出的那样,我接受了。它只是在网站上不可用。
标签: swift async-await