使用 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 实现了本地缓存,我的问题就解决了。
我注意到我的集合视图中的图像缓存使用了大量内存,我需要了解如何释放它。我了解 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 实现了本地缓存,我的问题就解决了。