UITableview大量图片

时间:2013-09-13 20:54:33

标签: ios uitableview uiimageview lazy-loading

据我所知,有关stackoverflow的问题已被问过几次。 但是,我正在寻找更先进的东西。

我的客户应用程序基本上是一个电子商务应用程序,一次有大约40-50个销售。在特定销售中,有100-300种产品。

考虑到图像的数量,每个大小约为150x200pi,我需要更快地加载这些图像。

我已经在使用SDWebImage库来获取图像。 (我甚至尝试过AfNetworking和Apple的LazyLoadImages)。 我尽可能预先获取一些图像。但客户仍然需要它更快。我看到像亚马逊的My Habit ios应用程序这样的应用程序几乎无缝地加载图像。我仍然不接近这一点。

鉴于图像数量庞大,很难预测哪些图像需要预取,因此无法预测用户可能选择查看的内容。

任何建议都非常感谢。

感谢。

3 个答案:

答案 0 :(得分:1)

你应该真正实现自己的缓存。您需要一个双层缓存:一个用于全尺寸图像,另一个用于拇指图像。

对于全尺寸图像,您的缓存应保存最大N * C + 2 * C图像,其中N是可见行数,C是可见列数 - 假设一个只能滚动行。 / p>

对于包含1列的表格视图,让可见行数为10.然后,最大全尺寸图像数量变为12。

对于包含1列和10个可见行的表视图,缓存必须包含范围[LB-1 ... UB + 1]中行的图像,其中LB是下限索引,UB是当前上限可见行的索引。

(注意:如果图像很小,您可以仔细扩大范围!)

您需要在用户滚动时逐出并加载图像。当滚动半行高时,会切换当前可见的行索引范围。

当需要加载图像时,此图像将不可见:假设用户向一个方向滚动,它仍然会远离变得可见半行。您需要利用这个短时间帧来正确准备图像,以便快速渲染(实际创建位图)。

您还需要拇指的第二个图像缓存。这是同样设计的,它只有更大的负载范围,比如[LB-10 .. UB + 10],甚至更多。

您的方法应该是异步的,并采用惰性初始化模式:

当您必须绘制图像时,请检查全尺寸是否已经可用。如果是,请绘制它,否则异步加载它并检查拇指图像是否已经可用,如果是,则绘制它,否则异步加载它并绘制静态占位符。你的加载方法应该异步运行!

加载完成后,检查单元格是否可见并更新图像。拇指图像可以覆盖占位符图像,并且全尺寸图像可以覆盖两者。否则,不是。

作为优化,当用户“快速”滚动时,禁用加载全尺寸图像。你需要凭经验弄清楚“快”是什么。

答案 1 :(得分:0)

最佳解决方案之一是在检索图像后对其进行缓存。

这是一个很好的例子,如何做到这一点

http://ezekiel.vancouver.wsu.edu/~wayne/yellowjacket/YellowJacket.zip

答案 2 :(得分:0)

在这种情况下,后端应该提供两个图像,一个相当小,一个具有全分辨率,这是很常见的。当用户滚动时,您正在使用缓存来获取具有缓存的小图像,但是,例如,如果UITableViewCell保持可见超过两秒,则继续获取高分辨率图像。