我正在开发一个新闻应用程序。我正在使用表格视图来显示新闻。要从服务器下载数据,我正在使用 发送异步请求 .
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
if ([data length] > 0 && error == nil)
{
downloadedItem = [GNNewsItems saveDataToModel:data];
if ([self.delegate respondsToSelector:@selector(receivedResponse:)])
{
[self.delegate performSelectorOnMainThread:@selector(receivedResponse:) withObject:downloadedItem waitUntilDone:NO];
}
}
else if ([data length] == 0 && error == nil)
{
// Data not downloaded
}
else if (error != nil)
{
// error
}
}];
目前为止,一切都好。现在考虑一个案例:
- 用户打开应用。
- 表视图发送下载第一个单元格内容的请求。假设下载数据需要 10 秒。
- 用户将表视图滚动到第 5 个单元格。
- 表视图发送对第 5 个单元格的请求。
- 现在用户返回到第一个单元格,但尚未下载单元格 1 发送的初始请求的内容。
- 表视图将为第一个单元格发送重复请求。
如何从表视图中取消重复请求?
创建一个NSMutableArray
,其中包含已启动请求的单元格的 indexPath。在启动 Web 请求之前,请检查请求是否已启动。如果没有,则启动它,否则什么都不做。
您的设计描述听起来像您没有使用标准的模型/视图设计范例。您应该将标题和其他相关数据存储在某种数据存储中,例如完整的故事或链接到相同的数据,例如数组或 CoreData 等。该对象是请求故事和更新数据元素的对象。然后它只在后台做一次,一旦得到,它就完成了。
然后,表视图使用该数据存储来填充表单元格。每次单元格滚动进入视图时,对故事进行空中请求是一个非常糟糕的设计。它具有您刚才提到的设计问题,而且非常浪费用户带宽和服务器资源。