2014-09-24 101 views
0

我正在开发一个新闻应用程序。我正在使用表视图来显示新闻。要从服务器下载数据,我正在使用sendAsynchronousRequest取消重复请求NSURLConnection

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

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

回答

0

创建一个NSMutableArray,其中将包含请求已经发起的小区的indexPath。在启动网络请求之前,如果请求已经启动,或者没有启动,请在单元格中检查新的网络请求。如果没有,那么启动它,否则什么也不做

0

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

然后tableView使用该数据存储填充表格单元格。这是一个非常糟糕的设计,在每次细胞滚动查看故事时,都会要求故事。它具有刚刚提到的设计问题,并且非常浪费用户带宽和服务器资源。