根据TableView / CollectionVIew中的位置取消NSOperations

时间:2014-07-31 18:20:18

标签: ios objective-c uitableview nsoperation

假设我有一个表视图或一个集合视图。在单元格中,我需要加载某些内容(例如图像)。我可以从本地存储(如果它已保存在那里)或从互联网上获取内容。无论哪种方式加载内容需要一段时间(500 kB图像)。

执行此操作的最佳方法是创建一个将在后台加载的NSOperation,然后在完成时调用委托。

但是假设用户进入表视图/集合视图并且队列开始获取第一组内容(1-10)但是然后用户快速滚动到最后(可见单元格100-110)我该怎么办?做?启动单元出现时会发生启动下载操作(cellForRowAtIndexPath),因此我需要等待所有内容下载,直到用户(现在位于tableView的末尾)看到内容。 我尝试在每个单元格上创建一个队列并在prepareForReuse中取消它,但这会使应用程序崩溃。

无论如何,如果用户位于tableview的一部分并且内容正在下载但尚未显示,并且进一步滚动导致下载被取消然后返回。然后他需要再次下载图像的前半部分,这对有限的数据计划来说并不好。

处理这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以让您的控制器类采用UITableViewDelegate协议,这将允许您将自定义代码注入–tableView:willDisplayCell:forRowAtIndexPath:(当要显示单元格时,通过表视图调用)。在其中,您可以计算出由于屏幕大小,只显示任何行的k索引内的行可能是可见的;因此,在此方法调用中,取消与该范围之外的行相关的所有加载操作(相对于indexPath参数)。