我有一个问题:不知道它的设计是否糟糕,或者我只需要一些代码。
我的问题是,如果我有很多单元格并快速滚动,我的单元格图像会加载图像"在行中#34; ,因为它们是异步内脏并且没有& #39;知道该单元格已被重用。
我应该:
期待听到您的意见!
此致 南
答案 0 :(得分:1)
你问:
[我应该]取消API通话吗?我怎么这么容易?我只是在异步块中使用
NSData dataWithContentsOfURL
是的,您可能确实要取消它,但遗憾的是dataWithContentsOfURL
不是可取消的请求。
您可能希望使用可取消的机制来检索图像。例如,您可以将NSURLSession
与dataTaskWithURL
一起使用,这将返回NSURLSessionTask
对象,您可以在需要时cancel
。如果使用NSURLConnection
(即,如果支持7.0之前的iOS版本),那么您必须使用NSURLConnection
的基于委托的再现,这也是可取消的。
检测细胞是否不存在?我该怎么做呢?细胞[可能]被重复使用。
你可以
在调用表格视图didEndDisplayingCell
时取消请求(在iOS 6.0及更高版本中);
当您的cellForRowAtIndexPath
正在配置小区时,您可以取消之前对该小区的任何请求;
正在异步更新单元格的完成块应该检查单元格是否仍然可见(通过调用[tableView cellForRowAtIndexPath:indexPath]
,一种表格视图方法,确认该NSIndexPath
的单元格是否仍然是可见;请注意,此UITableView
方法不应与名称相似的UITableViewDataSource
协议方法混淆。
请注意,有些课程可以帮助您解决此问题。查看AFNetworking或SDWebImage中的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是否具有相同的标签(并保存在字典中)
如果您有任何意见或这是一个糟糕的设计,请告诉我。
谢谢!