代码之家  ›  专栏  ›  技术社区  ›  Grant Park

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

  •  1
  • Grant Park  · 技术社区  · 11 年前

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

    2 回复  |  直到 9 年前
        1
  •  1
  •   Duncan C    11 年前

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

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

        2
  •  0
  •   kean    11 年前

    您应该有一个正确配置的内存缓存(例如,NSCache),用于存储根据显示大小调整大小的图像,这对内存和 drawing performance 。这是 a tutorial 关于如何配置NSCache以存储图像。这正是 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