在具有滚动索引的 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 中延迟加载图像的主要内容,如果未能解决你的问题,请参考以下文章