大型图像收集应用程序的内存管理

Memory Management On Large Image Collection Apps

包含许多图像(尤其是在 table 或集合视图中)的大型应用程序如何使用出队单元格管理缓存的基本思想是什么?没有人真正回答我之前关于此 的问题,我正在尝试使用 Parse 中的 100 多张图像填充集合视图。在未能通过手动代码找到好的解决方案以及将我的图像缩小到超低质量后,我尝试了许多不同的库,包括 SDWebImage、LRImageManager、Haneke 和 PINRemoteImage。我只想获得解决我的应用程序内存管理的好主意或方法。其他应用程序如何在可出列的视图中加载数百张 "fair" 优质照片?这是火箭科学吗?

答案是综合考虑。不要同时将所有图像加载到内存中。将它们作为文件保存到您的文档或缓存目录,并为 cellForRowAtIndexPath 中的每个单元格加载它们,并在用户将其滚动到屏幕外时简单地丢弃内存中的图像。

此外,请勿将大图像加载为缩略图。相反,当您下载它时,立即以您的目标显示大小生成缩略图版本并保存(AND 原始版本,如果需要的话。)然后您可以加载和显示缩略图,对内存的影响要低得多。由于您正在为特定设备生成缩略图,因此您可以只生成您需要的缩略图大小(视网膜或非视网膜,大小适合当前设备的屏幕。{iPad/4" phone, 5" phone、iPhone 6、6+ 等})

您应该有一个正确配置的内存缓存(例如 NSCache),它可以存储根据显示大小调整大小的图像,这对内存和 drawing performance. Here's a tutorial on how to configure NSCache to store images. And that's exactly what 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