一周前,Apple 刚刚在 UITableView 中发布了一些关于延迟加载图像的示例代码。我检查了它并将其实现到我自己的 UITableView (这是一个用于快速滚动的 drawRect ),看看是否与我已经在做的不同。
实施后我不确定什么是最好的;新代码或我已经拥有的代码。我没有看到我的 3GS 的速度有很大提高。
“沙盒”方法:懒加载图片,然后保存到沙盒中的本地tmp文件夹。每次显示单元格时,它都会查找具有该文件名的图像是否已位于沙箱文件夹中。如果是,它会检索图像并显示它,如果不是,它会继续下载,将其保存在本地,然后显示它。这样做的好处是第二次打开应用程序时图像不会是空白的。它们已经被下载并准备好显示。
缓存方法:这也会延迟加载图像,但是,现在我在 tableview 中显示的数组中的每个对象上都包含一个 UIImage。我现在不是在本地保存图像,而是下载图像并将其放入对象的数组中。现在,它不是每次都检查文件名,而是检查 UIImage 是否!= nil 并使用缓存的图像(如果为 nil,则下载)。
一个小的区别还在于,缓存代码在将图像缓存到单元格中显示的确切大小之前会调整其大小,而沙盒代码示例中使用的图像实际上比它需要显示的要大一些,这意味着它也必须在滚动时动态调整大小。几个月前我读到这可能有点贵,而且我也不确定它是否会在使用缓存图像而不是沙盒存储图像方面产生很大差异,因此无论如何都会占用更多 CPU(相比之下到您使用上面的缓存代码从缓存中保存的内容)。
我想我的问题是我是否应该打扰缓存代码?同样,新代码不会在新启动时立即加载图像,而旧代码实际上会这样做,因为它已经在沙箱中。由于我没有重用图像,我有很多图像要加载(从沙箱或缓存中),所以我没有注意到速度上有很大的差异。事实上,在我看来,在我的 3GS 上几乎无法分辨。滚动不是如丝般顺滑,我认为这是由于我无法重复使用大量图像(每个单元格的图像不同)。我还想知道,例如,一旦文件夹中有 1000 多张图像,沙盒方法是否会变慢,例如,最终让它查看更多的图像,而不仅仅是 100 幅左右。
我希望我说得通。我想对细节非常透彻,如果需要,我很乐意提供更多细节。
谢谢!