取消重复请求 NSURL 连接



我正在开发一个新闻应用程序。我正在使用表格视图来显示新闻。要从服务器下载数据,我正在使用 发送异步请求 .

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. 表视图将为第一个单元格发送重复请求。

如何从表视图中取消重复请求?

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

您的设计描述听起来像您没有使用标准的模型/视图设计范例。您应该将标题和其他相关数据存储在某种数据存储中,例如完整的故事或链接到相同的数据,例如数组或 CoreData 等。该对象是请求故事和更新数据元素的对象。然后它只在后台做一次,一旦得到,它就完成了。

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

最新更新