swift - 如何将缓存添加到 AsyncImage
问题描述
我是 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()
}
}
但这并不顺利。所以我想知道有没有办法向 AsyncImage 添加缓存?感谢任何帮助。
解决方案
我和你有同样的问题。我通过编写一个CachedAsyncImage
与.AsyncImage
AsyncImage
我制作了一个Swift Package来分享它。
CachedAsyncImage
具有与 完全相同的 API 和行为AsyncImage
,因此您只需更改它:
AsyncImage(url: logoURL)
对此:
CachedAsyncImage(url: logoURL)
除了AsyncImage
初始化器之外,您还可以指定要使用的现金(默认情况下URLCache.shared
使用):
CachedAsyncImage(url: logoURL, urlCache: .imageCache)
// URLCache+imageCache.swift
extension URLCache {
static let imageCache = URLCache(memoryCapacity: 512*1000*1000, diskCapacity: 10*1000*1000*1000)
}
请记住,在设置缓存时,响应(在本例中为我们的图像)必须不大于磁盘缓存的 5% 左右(请参阅此讨论)。
这是回购。
推荐阅读
- javascript - 我如何在节点 js 服务器中包含 css js
- javascript - Waypoints 计数器向上计数(然后向下计数)并且当 div 处于即时视图中时不执行脚本
- c++ - 在 C++ 中更改静态 const int 的值
- sql - 如何将表中的特定值添加到新列?
- hash - kafka 允许向主题添加分区但不能删除?
- vba - 从 Microsoft Outlook 在 Microsoft Access 中运行附加查询时缺少字段
- angular - 使用打字稿和角度在警报框上填写表格
- powershell - 如果帐户到期日期少于 30 天,请向其经理发送邮件
- c# - 通过外键获取实体值
- python - pipenv 创建虚拟环境出现错误