大型图像采集应用的内存管理

时间:2015-08-11 20:50:42

标签: ios image caching memory sdwebimage

包含许多图像的大型应用程序(尤其是在表格或集合视图中)如何管理带有出列单元格的缓存的基本思路是什么?没有人真正回答我之前关于这个iOS Memory Warnings的问题,我正试图用Parse的100多张图片填充一个集合视图。在没有找到一个包含手动代码的好解决方案以及将我的图像缩小到超低质量之后,我尝试了许多不同的库,包括SDWebImage,LRImageManager,Haneke和PINRemoteImage。我只是希望在处理我的应用程序的内存管理时获得一个好主意或方法。其他应用程序如何在可出局的视图中加载数百张“公平”质量的照片?这是火箭科学吗?

2 个答案:

答案 0 :(得分:1)

答案是各种各样的事情。请勿同时在内存中加载所有图像。将它们作为文件保存到文档或缓存目录中,并为cellForRowAtIndexPath中的每个单元格加载它们,并在用户将其滚动到屏幕外时简单地丢弃内存中的图像。

另外,请勿将大图像作为缩略图加载。相反,当您下载它时,立即生成目标显示大小的缩略图版本并保存( AND 原始版本,如果您需要它。)然后您可以加载和显示缩略图,降低记忆力。由于您正在为特定设备生成缩略图,因此您只能生成所需的缩略图尺寸(视网膜或非视网膜,尺寸适合当前设备的屏幕。{iPad / 4“手机,5”手机,iPhone 6 ,6 +等}})

答案 1 :(得分:0)

你应该正确配置内存缓存(例如NSCache),它会存储为其显示大小调整大小的图像,这对内存和drawing performance都有好处。这里是关于如何配置NSCache来存储图像的a tutorial。而这正是DFImageManager的作用。

let targetSize = CGSize(width: 100, height: 100)
let request = DFImageRequest(resource: imageURL, targetSize: targetSize, contentMode: .AspectFill, options: nil)
let task = DFImageManager.imageTaskForRequest(request) { (image, _, _, _) -> Void in
    // Image is resized to fill 100x100 px target size
    // Image is stored into mem cache, next request would finish synchronously
    var fetchedImage = image
}.resume()

// NSURLSession stores original data into NSURLCache