如何提高 UITableView 从 Documents Directory 加载数百张图像的性能?
Posted
技术标签:
【中文标题】如何提高 UITableView 从 Documents Directory 加载数百张图像的性能?【英文标题】:How to improve performance of UITableView loading hundreds of Images from Documents Directory? 【发布时间】:2013-05-13 19:15:23 【问题描述】:我正在从 Documents Directory 加载图像文件列表并将它们设置在自定义 UITableViewCell 中,但是,我之前的努力要么内存太重,要么导致 UITableView 滚动性能不佳。
在这些方法中,我将图像加载到容器类中,然后是一个数组。
我尝试过的:
UIImage+ImmediateLoad(自定义 UIImage 类别,它从文件路径加载图像并将其直接加载到内存中。这会导致 60FPS 滚动,但如果用户拥有超过 100 个相册,应用程序会崩溃。 )
MPMediaItem valueForProperty:MPMediaItemPropertyArtwork 方法。 (但是,这会导致滚动帧速率急剧下降。我认为这不会直接将图像加载到内存中(如果我错了,请纠正我)。
将文件路径传递给 UITableViewCell 本身,并让它加载图像。这也会导致滚动缓慢,但也不会限制内存。
这些图片每张最大为 1MB。
简而言之(我知道我要求很多),我要求一种方法来为 Documents 目录加载图像,这种方法不会占用太多内存,并且可以平滑滚动。
【问题讨论】:
【参考方案1】:另一种策略是拥有一个有序的图像路径列表和一个匹配的可变数组。假设用户在位置 0。加载图像说数组中的 0-10。当用户滚动时,总是保留最后 n 个图像,释放较旧的图像(将 NSNull 放入可变数组中),并预取下 n 个图像。这种挣扎发生在主动滚动期间,过多的后台工作会导致滚动卡顿。但是,它通过在任何给定时间仅在内存中保留相对较小的数据集来减少内存压力。
其他想法。您可以保存 UIImageViews 而不仅仅是图像。与其扔出超出范围的图像,不如将它们扔到 NSCache 中。
如果所有其他方法都失败了,您可以执行 PhotoScrollerNetwork 的操作,将图像预渲染到一个大文件中,然后使用 mmap 抓取任何给定图像的像素并快速创建一个 CGImage。在这里,您以文件系统空间换取速度。
【讨论】:
底线当然是没有完美的解决方案 - 你需要做出许多权衡,而且它永远不会完美。我真正关注的是这个问题:“典型的客户将如何使用它?”,而不是试图解决像疯子一样滚动的白痴。此外,您可能想考虑解决一个不同的问题:也就是说,一个更流畅的解决方案是为用户提供一个缩略图的滚动列表(您可以预先创建并轻松缓存),并且仅在一个时显示较大的图像被选中。假设为jpg图片,1M图片的解压时间/空间是巨大的。 其实我用的是png。这有什么不同吗?以上是关于如何提高 UITableView 从 Documents Directory 加载数百张图像的性能?的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableView 内的 UIImageView 中从 Web 加载图像
如何从 UITableView iphone 获取 UITableView IndexPath?
如何从 SearchResultDetailView 返回 UITableView