ios - UITableview大量图片

标签 ios uitableview uiimageview lazy-loading

<分区>


要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预期结果。另请参阅: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/

上一篇:ios - UICollectionView 与 UITextView 非常慢

下一篇:iphone - UIView 动画在主线程上被阻止

相关文章:

ios - 为什么 UIImageView 只旋转一次?

ios - 如何检查我的 AFNetworking 库使用的是哪个版本的 TLS?

ios - Swift 枚举不同类型的关联值

ios - 深度链接到 ebay 应用程序 iOS Swift 中的特定产品

ios - 在后台运行时测量 iPhone 高度

ios - 我无法在 TableView 内加载 TableView 单元格

ios - 删除 tableView 行

ios - 图像动画

ios - Storyboard?.instantiateViewController(withIdentifier : "") as! viewcontroller

ios - 图案图像如何实现视差效果?