UITableView和异步图像url调用

时间:2014-11-11 10:39:35

标签: objective-c uitableview asynchronous

我有一个问题:不知道它的设计是否糟糕,或者我只需要一些代码。

  • 我有一个UITableView
  • 我将来自服务器的图像异步加载到NSMutableDictionary中 缓存并将其加载到单元格中

我的问题是,如果我有很多单元格并快速滚动,我的单元格图像会加载图像"在行中#34; ,因为它们是异步内脏并且没有& #39;知道该单元格已被重用。

我应该:

  • 取消API通话?我怎么这么容易?我只是使用NSData 异步块中的dataWithContentsOfURL
  • 检测细胞是否不存在?我该怎么做呢?细胞我 重复使用

期待听到您的意见!

此致 南

4 个答案:

答案 0 :(得分:1)

你问:

  

[我应该]取消API通话吗?我怎么这么容易?我只是在异步块中使用NSData dataWithContentsOfURL

是的,您可能确实要取消它,但遗憾的是dataWithContentsOfURL不是可取消的请求。

您可能希望使用可取消的机制来检索图像。例如,您可以将NSURLSessiondataTaskWithURL一起使用,这将返回NSURLSessionTask对象,您可以在需要时cancel。如果使用NSURLConnection(即,如果支持7.0之前的iOS版本),那么您必须使用NSURLConnection的基于委托的再现,这也是可取消的。

  

检测细胞是否不存在?我该怎么做呢?细胞[可能]被重复使用。

你可以

  • 在调用表格视图didEndDisplayingCell时取消请求(在iOS 6.0及更高版本中);

  • 当您的cellForRowAtIndexPath正在配置小区时,您可以取消之前对该小区的任何请求;

  • 正在异步更新单元格的完成块应该检查单元格是否仍然可见(通过调用[tableView cellForRowAtIndexPath:indexPath],一种表格视图方法,确认该NSIndexPath的单元格是否仍然是可见;请注意,此UITableView方法不应与名称相似的UITableViewDataSource协议方法混淆。


请注意,有些课程可以帮助您解决此问题。查看AFNetworkingSDWebImage中的UIImageView类别。这些都可以优雅地进行异步图像检索,如果重复使用图像视图,则会取消先前的请求。

答案 1 :(得分:0)

UITableView- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath {...}的委托方法,您可以在此处取消任何正在进行的请求或修改单元格对象。

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath {
    [self cancelOnGoingRequest];
}

答案 2 :(得分:0)

在我的情况下,我可以使用延迟加载类通过异步调用加载10个图像(对于10个单元格)并在自定义设计单元格的imageview中设置图像,当用户向下滚动然后再次延迟加载类时被调用以调用页码,它工作正常,所以你可以使用它。

答案 3 :(得分:0)

只是将其发布为对我所做的评论。

我决定保留我的代码并保留一个本地缓存。我将所有图像保存在字典中,并将网址作为密钥保存。为了避免imageview多次加载图像(由于cel被重用),我在异步调用之前向imageview添加了一个随机标签,并在下载图像时检查了imageview是否具有相同的标签(并保存在字典中)

如果您有任何意见或这是一个糟糕的设计,请告诉我。

谢谢!