我需要对将用于填充表视图单元格的文本字段的信息提出一些请求。但是,该单元可以在请求完成之前被重用。我如何将AFNetworking GET请求与uitableview单元格相关联,以便能够在prepareForReuse中取消它?
(如果我没有使用AFNetworking,这将是一个不需要动脑筋的问题)
我不确定为什么AFNetworking对这个问题有很大的影响。
我的解决方案是:
- 将当前请求的url保留在自定义单元格中
- 对网络调用的完成块中的单元进行弱引用,并捕获请求的url。
- 清除preprareForReuse中单元格的url。
- 在更新cell之前,在网络完成块中检查cell捕获的URL是否仍然匹配cell的URL,如果不匹配,则不更新cell(只是缓存数据或更新模型对象而不刷新cell)。
我倾向于让网络请求在大多数情况下完成,但如果你使用数据会话任务,你可以存储在单元格中的NSURLSessionDataTask,并在prepareForReuse中调用cancel
。AFNetworking中可能还有其他不那么容易取消的选项。
如果你将AFHTTPRequestOperation与tableview中的每个单元格相关联,你可以像这样管理和取消你的GET请求:
@property (nonatomic, strong) AFHTTPRequestOperation *operation;
- (void)prepareForReuse{
[super prepareForReuse];
[self.operation cancel];
}
AFHTTPRequestOperation只是NSOperation的一个子类
你不能。UITableViewCell是非常临时的。它不是指表格中的某一行;它将被重复用于不同的线路。你应该这样做:
- 为想要在行中显示的数据设置缓存。
- 创建单元格时,尝试用缓存中的数据填充它。
- 如果失败,则启动异步请求。
- 当异步请求成功时,它将其数据存入缓存。然后,它确定表的哪一行包含刚刚下载的数据,并重新加载该行。
- 不需要您做任何事情,操作系统将要求您再次创建单元格,这次数据在缓存中。注意,单元格可以是完全不同的单元格,但显示相同的数据。
请注意,包含数据的行可能与启动请求时包含数据的行不同。例如,用户可能在表中添加或删除了项,或者更改了排序顺序。