问题描述
我在集合视图中注意到图像缓存中的大量内存使用,因此需要了解如何释放它。我了解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
,在这里您可以限制总数或成本。此外,我们经常采用两层缓存机制(具有较小的内存限制,较大的持久存储缓存)。
您可能会考虑使用许多第三方库之一(AlamofireImage,KingFisher,SDWebImage等),因为它们倾向于采用体面的缓存策略,这使您摆脱了这种麻烦。它们都为UIImageView
提供了不错的“异步映像”扩展。 (例如,如果您快速浏览大集合视图,则您与我们共享的实现会遇到积压问题,而这些UIImageView
扩展很容易解决。)UICollectionViewDataSource
这类代码实在不应该让您感到负担。
给我的印象是Firestore自动缓存适用于云存储,但仅适用于云数据库。使用NSCache实施本地缓存后,问题就解决了。