<分区>
要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预期结果。另请参阅:Stack Overflow question checklist
已关闭 9 年前。
<分区>
要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预期结果。另请参阅:Stack Overflow question checklist
已关闭 9 年前。
据我了解,这个问题在 stackoverflow 上已被问过几次。 但是,我正在寻找更高级的东西。
我的客户应用程序基本上是一个电子商务应用程序,一次大约有 40-50 笔销售。在一次给定的销售中,有 100-300 种产品。
考虑到图像的数量,每个图像的大小约为 150x200pi,我需要让这些图像加载得更快。
我已经在使用 SDWebImage 库来获取图像。 (我什至尝试过 AfNetworking 和 Apple 的 LazyLoadImages)。 我会尽可能预取一些图像。但是客户仍然需要它更快。我见过一些应用程序,例如亚马逊的 My Habit ios 应用程序,几乎可以无缝地加载图像。我还没有接近那个。
鉴于图像数量巨大,很难预测要预取哪些图像,因此无法预测用户可能选择查看的内容。
非常感谢任何建议。
谢谢。
最佳答案
您确实应该实现自己的缓存。您需要两层缓存:一层用于全尺寸图像,一层用于缩略图图像。
对于全尺寸图像,您的缓存最多应保存 N*C + 2*C 个图像,其中 N 是可见行数,C 是可见列数 - 假设只能滚动行。
对于 1 列的表格 View ,可见行数为 10。那么,全尺寸图像的最大数量变为 12。
对于具有 1 列和 10 个可见行的 TableView ,您的缓存必须保存 [LB-1 .. UB+1] 范围内的行的图像,其中 LB 是下限索引,UB 是当前上限可见行的索引。
(注意:如果图片较小,可小心扩大范围!)
您需要在用户滚动时逐出并加载图像。当滚动半行高度时,会切换行索引的当前可见范围。
当需要加载图像时,该图像将不可见:假设用户向一个方向滚动,它距离可见还有半行高度。您需要利用这段较短的时间来正确准备图像,以便可以快速渲染它(实际上是创建位图)。
您还需要为拇指提供第二个图像缓存。这是同样的设计,只是具有更大的前方负载范围,例如 [LB-10 .. UB+10],甚至更多。
您的方法应是异步的并采用延迟初始化模式:
当您必须绘制图像时,请检查全尺寸是否已经可用。如果是,则绘制它,否则异步加载它并检查缩略图是否已经可用,如果是,则绘制它,否则异步加载它并绘制静态占位符。您的加载方法应异步运行!
加载完成后,检查单元格是否可见并更新图像。缩略图图像可以覆盖占位符图像,并且全尺寸图像可以覆盖两者。否则,不会。
作为一项优化,当用户“快速”滚动时禁用全尺寸图像的加载。您需要凭经验弄清楚什么是“快”。
关于ios - UITableview大量图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18795080/