AFNetworking:如何将异步JSON请求与UITableViewCell关联



我需要对将用于填充表视图单元格的文本字段的信息提出一些请求。但是,该单元可以在请求完成之前被重用。我如何将AFNetworking GET请求与uitableview单元格相关联,以便能够在prepareForReuse中取消它?

(如果我没有使用AFNetworking,这将是一个不需要动脑筋的问题)

我不确定为什么AFNetworking对这个问题有很大的影响。

我的解决方案是:

  1. 将当前请求的url保留在自定义单元格中
  2. 对网络调用的完成块中的单元进行弱引用,并捕获请求的url。
  3. 清除preprareForReuse中单元格的url。
  4. 在更新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是非常临时的。它不是指表格中的某一行;它将被重复用于不同的线路。你应该这样做:

  1. 为想要在行中显示的数据设置缓存。
  2. 创建单元格时,尝试用缓存中的数据填充它。
  3. 如果失败,则启动异步请求。
  4. 当异步请求成功时,它将其数据存入缓存。然后,它确定表的哪一行包含刚刚下载的数据,并重新加载该行。
  5. 不需要您做任何事情,操作系统将要求您再次创建单元格,这次数据在缓存中。注意,单元格可以是完全不同的单元格,但显示相同的数据。

请注意,包含数据的行可能与启动请求时包含数据的行不同。例如,用户可能在表中添加或删除了项,或者更改了排序顺序。

最新更新