【发布时间】:2010-03-15 15:58:35
【问题描述】:
我正在 iPhone 上开发,我在 AppStore 中看到图像在 UITableView 中逐步下载...我该如何实现? 我的想法是检测显示的内容(显示了哪些单元格)并下载这些图像。我的问题是我不知道如何检测显示的单元格! 这是一个好方法吗?
最好的
【问题讨论】:
标签: iphone objective-c uitableview uiscrollview uiimageview
我正在 iPhone 上开发,我在 AppStore 中看到图像在 UITableView 中逐步下载...我该如何实现? 我的想法是检测显示的内容(显示了哪些单元格)并下载这些图像。我的问题是我不知道如何检测显示的单元格! 这是一个好方法吗?
最好的
【问题讨论】:
标签: iphone objective-c uitableview uiscrollview uiimageview
在 iPhone 开发者技术讲座上演示的方式是使用 NSOperation 和 NSOperationQueue。
这个想法是把你的图片下载请求(使用 NSURLRequest)封装到一个 NSOperation 中。
您可以将您的单元格设置为操作完成时发送的回调的接收者,以便您可以将图像附加到单元格(手动绘制,或将其添加到图像视图)。
然后基本上,在您的cellForRowAtIndexPath 方法中,告诉单元格开始下载图像,并让单元格创建一个 NSOperation 并将其添加到由您的表格视图控制器或其他东西管理的操作队列中。
队列将开始执行操作并在完成后回调每个单元。
如果您愿意,您可以在单元格移出屏幕时取消操作,这样您就不会浪费资源下载将被丢弃的图像,因为单元格将不可见以显示图像。
【讨论】:
tableView:cellForRowAtIndexPath: 方法后会显示一个单元格,因为该方法为表格视图提供了要显示的单元格。在您的单元子类中,有一个方法可以创建一个封装图像下载的 NSOperation,并将其添加到由您的表格视图控制器或应用程序中的其他位置管理的 NSOperationQueue。
tableView:cellForRowAtIndexPath:。当且仅当需要在屏幕上显示单元格时才调用该方法。您可以使用此方法了解单元格何时显示在屏幕上。单元格被重用,因此当第一次加载表格视图时,该方法会为最初需要显示的每个单元格调用一次,然后为随后在屏幕上滚动的每个单元格调用一次。当某个单元格显示后需要下一次显示并被复用时,调用该方法
这里是an example,介绍了如何实现 Jasarien 谈到的基本理念。根据您的应用程序的需要,这可能就足够了,并且通常是一个很好的例子来说明如果不是这样的话。
【讨论】:
我会将每个单元格实现为 UITableViewCell 的子类,然后在子类中覆盖 willMoveToWindow: method。 willMoveToWindow:当单元格视图在屏幕上可见或离开屏幕时调用(newWindow 为 nil)。然后每个单元格可以排队请求以加载其图像,因为它变得可见(如果它离开屏幕,甚至可能取消其排队的请求)。
顺便说一句,您可以使用 UITableView 的visibleCells property 来获取可见的单元格列表。
【讨论】:
@Jasarien:很好的答案
或者,如果您愿意,也可以使用three20 项目。有一个 TTTableViewController 已经处理了你想要的所有东西。您只需输入图像视图和中提琴的 URL。
TT 还将您的图像缓存在内存或磁盘中。
查看捆绑在 three20 gitbub 资源中的示例项目。有一个例子。
【讨论】:
这就是所谓的 LazyTableView...你可以从这里 gt 教程
http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html
【讨论】:
请通过此链接,并尝试集成Lazy table view load,可以实现你的输出,http://www.cocoaintheshell.com/2011/05/progressive-images-download-imageio/在Download button click方法中更改ProgressiveImageDownloadViewController中的url。
【讨论】: