在具有滚动索引的 UITableView 中延迟加载图像

Posted

技术标签:

【中文标题】在具有滚动索引的 UITableView 中延迟加载图像【英文标题】:Lazy loading images in a UITableView that has a scroll index 【发布时间】:2011-06-09 01:44:46 【问题描述】:

我认为这是对一个老问题的新解释,但我完全被困在这里。

在我的应用程序中,我有一个包含 650 个单元格的 UITableView,每个单元格都有一个自定义的 16x16 RGB 图标。在最新的 ios 设备上,在显示表格之前将所有这些图标加载到内存中完全可以正常工作,但在较旧的硬件上,我想实现一个延迟加载系统,只加载它需要的图标。

我已经实现了 Apple LazyTableImages 示例(它使用 UIScrollView 委托来确定表格何时停止移动以加载可见图标),但我遇到了另一个障碍。

我的UITableView还有一个section index显示(即右侧的标签列表可以上下滑动快速滚动),而LazyTableImages的例子没有考虑到这一点。 如果我使用索引滚动,图像不会延迟加载。 :(

据我所知,滚动索引实际上并没有触发任何委托事件。 所以我想知道,有没有其他人尝试在带有滚动索引的表上实现延迟加载?有没有办法跟踪索引并找出用户是否与之交互?

谢谢!

【问题讨论】:

你不能在表数据源的tableView:cellForRowAtIndexPath: 方法中按需加载图像(或开始异步加载)吗?您可以添加超时,以便仅加载“存活”的单元格的图像,例如至少半秒,因此您最终不会为立即再次消失的单元格加载图像。 嗯,这是一个有趣的想法。这与我最终采用的想法有点不同(例如,延迟加载的计时器)。我可能会尝试一下,看看情况如何。谢谢! 【参考方案1】:

在与我的几个 iOS 开发伙伴讨论之后,我想出了一个效果很好的解决方案。

我对其进行了设置,以便除了从 UIScrollView 委托加载的图标之外,NSTimer 对象将定期调用一个方法,该方法每 0.5 秒检查一次当前可见的表格单元格 ([UITableView indexPathsForVisibleRows]),并加载任何屏幕上尚未在单个单独线程中加载的图标。

我试图使解决方案尽可能高效,因此我确保计时器仅在 tableView 可见且静止时才处于活动状态,并且我喜欢它,因为这意味着无论每个可见图标都得到了解决。

我发现的一件事是,如果 tableView 在线程循环通过可见单元格时重新加载(很少见,但有可能),它会崩溃。解决此问题的方法是确保在加载图标时保留每个单元格数据源条目。

【讨论】:

以上是关于在具有滚动索引的 UITableView 中延迟加载图像的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 的 UITableView 中滚动时索引错误

黑色半透明导航栏/UITableView/内容插入/滚动位置问题

UITableView滚动到不需要的索引或位置

UITableView 滚动到索引被破坏

具有共享滚动手势的嵌套 UITableView

如何解决 uiTableview 滚动应用程序崩溃,它会在 swift 中引发数组索引超出范围异常?