在 UITableView 中渐进式下载图像

Posted

技术标签:

【中文标题】在 UITableView 中渐进式下载图像【英文标题】:Progressive download of images in a UITableView 【发布时间】:2010-03-15 15:58:35 【问题描述】:

我正在 iPhone 上开发,我在 AppStore 中看到图像在 UITableView 中逐步下载...我该如何实现? 我的想法是检测显示的内容(显示了哪些单元格)并下载这些图像。我的问题是我不知道如何检测显示的单元格! 这是一个好方法吗?

最好的

【问题讨论】:

【参考方案1】:

在 iPhone 开发者技术讲座上演示的方式是使用 NSOperationNSOperationQueue

这个想法是把你的图片下载请求(使用 NSURLRequest)封装到一个 NSOperation 中。

您可以将您的单元格设置为操作完成时发送的回调的接收者,以便您可以将图像附加到单元格(手动绘制,或将其添加到图像视图)。

然后基本上,在您的cellForRowAtIndexPath 方法中,告诉单元格开始下载图像,并让单元格创建一个 NSOperation 并将其添加到由您的表格视图控制器或其他东西管理的操作队列中。

队列将开始执行操作并在完成后回调每个单元。

如果您愿意,您可以在单元格移出屏幕时取消操作,这样您就不会浪费资源下载将被丢弃的图像,因为单元格将不可见以显示图像。

【讨论】:

我的问题是如何检测显示的单元格? 在调用tableView:cellForRowAtIndexPath: 方法后会显示一个单元格,因为该方法为表格视图提供了要显示的单元格。在您的单元子类中,有一个方法可以创建一个封装图像下载的 NSOperation,并将其添加到由您的表格视图控制器或应用程序中的其他位置管理的 NSOperationQueue。 当我说显示时,我的意思是在屏幕上可见...如果您查看应用商店,只有当滚动视图滚动时才会下载图像!如何检测显示的单元格? 就像我说的。当要在屏幕上显示一个单元格时,会调用tableView:cellForRowAtIndexPath:。当且仅当需要在屏幕上显示单元格时才调用该方法。您可以使用此方法了解单元格何时显示在屏幕上。单元格被重用,因此当第一次加载表格视图时,该方法会为最初需要显示的每个单元格调用一次,然后为随后在屏幕上滚动的每个单元格调用一次。当某个单元格显示后需要下一次显示并被复用时,调用该方法【参考方案2】:

这里是an example,介绍了如何实现 Jasarien 谈到的基本理念。根据您的应用程序的需要,这可能就足够了,并且通常是一个很好的例子来说明如果不是这样的话。

【讨论】:

谢谢,但仍然无法知道哪个单元格在屏幕上可见! 这是对 UIImageView 的一个很好的扩展(希望我自己也能想到 ;))但它与我描述的 NSOperation 方法完全不同。这非常适合与 UIImageViews 一起使用,但在某些情况下,尤其是在您希望单元格快速滚动的情况下,使用 UIImageView 可能会因为拥有丰富的 View 层次结构而导致过多的性能拖累。在这些情况下,使用多线程方法更有意义。【参考方案3】:

我会将每个单元格实现为 UITableViewCell 的子类,然后在子类中覆盖 willMoveToWindow: method。 willMoveToWindow:当单元格视图在屏幕上可见或离开屏幕时调用(newWindow 为 nil)。然后每个单元格可以排队请求以加载其图像,因为它变得可见(如果它离开屏幕,甚至可能取消其排队的请求)。

顺便说一句,您可以使用 UITableView 的visibleCells property 来获取可见的单元格列表。

【讨论】:

Thx visibleCell 正是我想要的!【参考方案4】:

@Jasarien:很好的答案

或者,如果您愿意,也可以使用three20 项目。有一个 TTTableViewController 已经处理了你想要的所有东西。您只需输入图像视图和中提琴的 URL。

TT 还将您的图像缓存在内存或磁盘中。

查看捆绑在 three20 gitbub 资源中的示例项目。有一个例子。

【讨论】:

谢谢,但我已经完成了大部分工作......不想重新开始! Three20 很棒,如果你打算使用它提供的很多东西,但是因为与 Three20 相关的所有东西都与 TTStyle 的东西紧密耦合,如果你只想要它会带来很多开销使用一两个功能。【参考方案5】:

这就是所谓的 LazyTableView...你可以从这里 gt 教程

http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html

【讨论】:

【参考方案6】:

请通过此链接,并尝试集成Lazy table view load,可以实现你的输出,http://www.cocoaintheshell.com/2011/05/progressive-images-download-imageio/在Download button click方法中更改ProgressiveImageDownloadViewController中的url。

【讨论】:

以上是关于在 UITableView 中渐进式下载图像的主要内容,如果未能解决你的问题,请参考以下文章

UITableView - 带有背景图像的 UIRefreshControl

渐进式图像渲染,逐像素加载图像并在 imageLoader 中更新图像视图

渐进式下载[关闭]

为啥我的项目在手机中将其作为渐进式 Web 应用程序下载时找不到一些图像?

在 UITableView 的单元格中下载图像的最佳实践? iOS/斯威夫特

关于使用沙盒与缓存进行 UITableView 异步图像下载的建议