使用 UIImage(data:) 时如何释放缓存的图像?

How do I release cached images when using UIImage(data:)?

我注意到我的集合视图中的图像缓存使用了大量内存,我需要了解如何释放它。我了解 UIImage(named:)UIImage(contentsOfFile:) 之间的区别。但是,我正在使用 UIImage(data:) 并且我似乎找不到任何关于在这种情况下释放图像缓存的文档。任何帮助表示赞赏。这是我的代码片段:

if let setImage = cell?.viewWithTag(101) as? UIImageView {
    if let url = URL(string: imageURLs[indexPath.item]) {
        let task = URLSession.shared.dataTask(with: url, completionHandler: { data, _, error in
            guard let data = data, error == nil else {
                print("No data detected: \(Error.self)")
                return
            }
            DispatchQueue.main.async {
                let newImageData = UIImage(data: data)

                self.imageData[indexPath.item] = newImageData!
                setImage.image = self.imageData[indexPath.item] as? UIImage
            }
        })
        task.resume()
        URLSession.shared.finishTasksAndInvalidate()
    }
}

UIImage(data:) 不存储在系统图像缓存中。因此,如果您从 imageData 中删除对相关图像的所有引用,请确保图像视图得到释放等,您应该没问题。

如果 imageData 是一个简单的集合,请考虑将其设为 NSCache,您可以在其中限制总计数或成本。此外,我们经常采用两层缓存机制(具有更小的 in-memory 限制,更大的持久存储缓存)。

您可能会考虑使用众多第三方库(AlamofireImage、KingFisher、SDWebImage 等)中的一种,因为它们倾向于采用合适的缓存策略,让您摆脱困境。他们都为 UIImageView 提供了很好的“异步图像”扩展。 (例如,如果您在大型集合视图中快速滚动,您与我们分享的实施将会遇到积压问题,这些 UIImageView 扩展可以轻松解决这些问题。)您的 UICollectionViewDataSource真的不应该背负这种代码。

我的印象是 Firestore auto-caching 适用于云存储,但它仅适用于云数据库。一旦我用 NSCache 实现了本地缓存,我的问题就解决了。