首页 > 解决方案 > 如何将缓存添加到 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 添加缓存?感谢任何帮助。

标签: swiftswiftui

解决方案


我和你有同样的问题。我通过编写一个CachedAsyncImage与.AsyncImageAsyncImage

我制作了一个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% 左右(请参阅此讨论)。

这是回购


推荐阅读