0

我知道这个问题已经在stackoverflow上被问过几次了。但是,我在这里寻找更高级的东西。

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

鉴于图像的数量,每个大小约为 150x200pi,我需要让这些图像加载得更快。

我已经在使用 SDWebImage 库来获取图像。(我什至尝试过 AfNetworking 和 Apple 的 LazyLoadImages)。我会尽可能预取一些图像。但是客户仍然需要它更快。我见过一些应用程序,比如亚马逊的 My Habit ios 应用程序几乎可以无缝加载图像。我还没有接近那个。

鉴于图像的绝对数量,很难预测要预取哪些图像,因此无法预测用户可能会选择看什么。

任何建议都非常感谢。

谢谢。

4

3 回答 3

1

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

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

对于 1 列的表格视图,让可见行数为 10。那么,全尺寸图像的最大数量变为 12。

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

(注意:如果图片很小,请谨慎扩大范围!)

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

当需要加载图像时,该图像将不可见:假设用户向一个方向滚动,它距离可见还有半行高。您需要利用这个短时间框架来正确准备图像,以便可以快速渲染(实际上是创建位图)。

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

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

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

加载完成后,检查单元格是否可见并更新图像。缩略图可能会覆盖占位符图像,而全尺寸图像可能会覆盖两者。否则,不会。

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

于 2013-09-13T22:54:53.863 回答
0

最好的解决方案之一是在检索图像后缓存图像。

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

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

于 2013-09-13T21:45:58.280 回答
0

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

于 2013-09-13T21:50:48.373 回答