取消重复请求NSURLConnection

时间:2014-09-24 11:25:28

标签: ios objective-c nsurlconnection

我正在开发新闻应用程序。我正在使用表格视图来显示新闻。要从服务器下载数据,我正在使用 sendAsynchronousRequest

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
             }
        }];

到目前为止一切顺利。现在考虑一个案例:

  1. 用户打开应用。
  2. 表格视图发送下载第一个单元格内容的请求。 我们假设下载数据需要10秒钟。
  3. 用户将表​​格视图滚动到第5个单元格。
  4. 表视图发送第5个单元格的请求。
  5. 现在用户返回第一个单元格,但单元格1发送的初始请求的内容尚未下载。
  6. 表视图将发送第一个单元格的重复请求。
  7. 如何从表格视图中取消重复请求?

2 个答案:

答案 0 :(得分:0)

创建一个NSMutableArray,其中包含已启动请求的单元格的 indexPath 。在启动单元格中的新Web请求之前,检查是否已启动if请求。如果没有,则启动它,否则什么也不做。

答案 1 :(得分:0)

您的设计说明听起来好像您没有使用标准的模型/视图设计范例。您应该存储标题和其他相关数据,例如完整故事或某些数据存储区中的链接,例如,数组或CoreData等。该对象是请求故事和更新数据元素的对象。然后它只会在背景中执行一次,一旦完成,就完成了。

然后tableView使用该数据存储区来填充表格单元格。每当一个单元格滚动到视图中时,对于故事的空中请求是一个非常糟糕的设计。它存在您刚刚提到的设计问题,而且非常浪费用户带宽和服务器资源。