我是SwiftUI的新手,正在寻找如何从URL下载图像。我发现在iOS15中你可以使用AsyncImage来处理图像的所有阶段。代码如下所示。
AsyncImage(url: URL(string: urlString)) { phase in
switch phase {
case .success(let image):
image
.someModifers
case .empty:
Image(systemName: "Placeholder Image")
.someModifers
case .failure(_):
Image(systemName: "Error Image")
.someModifers
@unknown default:
Image(systemName: "Placeholder Image")
.someModifers
}
}
我会启动我的应用程序,每次我在我的列表上上下滚动时,它都会再次下载图片。那么我如何才能添加缓存呢?我试着像在Swift中那样添加缓存。类似于这样。
struct DummyStruct {
var imageCache = NSCache<NSString, UIImage>()
func downloadImageFromURLString(_ urlString: String) {
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { data, response, error in
if let _ = error {
fatalError()
}
guard let data = data, let image = UIImage(data: data) else { return }
imageCache.setObject(image, forKey: NSString(string: urlString))
}
.resume()
}
}
但它并没有去好。所以我想知道有没有一种方法来添加缓存到异步图像?感谢任何帮助。
5条答案
按热度按时间d7v8vwbk1#
希望这能对其他人有所帮助。我找到了this great video,它谈到了使用下面的代码来构建一个异步图像缓存函数,以供自己使用。
ncgqoxb02#
AsyncImage使用默认的URLCache。管理该高速缓存的最简单方法是更改默认URLCache的属性
xqnpmsa83#
用户喜欢这个
图像视图.swift
图像管理器.swift
zed5wv104#
也许后来的党,但我来到了这个确切的问题,关于穷人的异步图像时,与滚动视图/ LazyVStack布局使用。
根据this thread,接缝的问题是在某种程度上由于苹果公司目前的实施和未来的某个时候,它将得到解决.
我认为我们可以使用的最适合未来的方法是类似于response from Ryan Fung的方法,但不幸的是,它使用了旧语法,并且缺少重载的init(有和没有占位符)。
我扩展了这个解决方案,涵盖了this GitHub's Gist上缺失的情况。您可以像使用当前的AsyncImage实现一样使用它,以便当它一致地支持缓存时,您可以将其替换掉。
wn9m85ua5#
我遇到了和你一样的问题,我通过编写一个
CachedAsyncImage
来解决它,它保持了与AsyncImage
相同的API,这样它们就可以很容易地互换,同时也考虑到AsyncImage
将来对本机缓存的支持。我做了一个Swift Package来分享它。
CachedAsyncImage
具有与AsyncImage
完全相同的API和行为,因此您只需更改以下内容:改为:
除了
AsyncImage
初始化器,你还可以指定你想要使用的缓存(默认情况下使用URLCache.shared
):一个二个一个一个
请记住,设置缓存时,响应(在本例中是我们的映像)必须不大于磁盘缓存的5%(参见此讨论)。
这是repo。