2013-10-04 46 views
1

我同时从服务器下载一些信息,我使用相同的NSOperatioQueue。我有一个问题。例如,如果下载操作由于某种原因失败,我不想从队列中删除该操作。NSOperation和NSOperationQueue

现在,即使它从服务器收到响应后立即失败,操作也会从队列中移除。

有什么办法可以告诉队列一个特定的操作没有逻辑完成,它应该保持队列?

就我而言,我正在下载一组信息。例如,取得县内的所有地点,然后取得每个县的所有房屋。因此,在某些情况下,如果用户未使用有效令牌登录,则不能下载县。在这种情况下,服务器将返回失败消息。我希望将这些项目保留在队列中,以便在用户登录到应用程序时再次尝试。

示例代码

self.downloadQueue.maxConcurrentOperationCount = 1; 
    for(Campaign *campaign in campaigns) 
    { 
     isContentUpdated = false; 
     if(self.operation) 
      self.operation = Nil; 
     self.operation = [[DownloadOutlets alloc] initWithCampaign:campaign]; 
     [self.downloadQueue addOperation:operation]; 
    } 

其中downloadQueue是NSOperationQueue和DownloadOutlets延伸的NSOperation。 谢谢

+0

您的操作如何设置?显示一些代码示例。 –

+0

你是什么意思?如果它已经执行了所有的代码(无论是成功还是失败),为什么要在队列中保留一个操作? – micantox

+0

就我而言,我正在下载一组信息。例如,取得县内的所有地点,然后取得每个县的所有房屋。因此,在某些情况下,如果用户未使用有效令牌登录,则不能下载县。在这种情况下,服务器将返回失败消息。我想把这些物品放在队列中。 – Zach

回答

1

您不应该将失败的操作保留在队列中。失败的操作已完成其任务。您应该让您的操作员通过completionBlock或其他方式监听操作状态,并决定下一步该做什么。如果涉及确定操作失败,但应该重试类似的操作,则应该添加另一个操作以再次执行任务。

另一种方法是在操作中重试下载,直到成功,然后才结束操作。然而,这并不是最佳设计,因为操作不会并且不应该具有决定是否重试,通知用户等所需的所有信息。

0

您不应该在队列中保留失败的操作,但使用队列串行取数据,并停止,如果操作失败排队:

@implementation DataAdapter 
// ... 

-(void)setup{ 
    // weak reference to self to avoid retain cycle 
    __weak DataAdapter* selfRef= self; 

    // create a block that will run inside the operation queue 
    void(^pullCountriesBlock)(void)= ^{ 
      [[DownloadManager instance] fetchAllCountriesWithCompletionBlock:^(Result* result){ 
      if(result.successful){ 
       // on success 
       [selfRef didFetchDataForAction:action]; 
      }else{ 
       // on failure 
       [selfRef failedToFetchDataForAction:action]; 
      } 
    }; 

    self.actions= [NSMutableArray new]; 
    [self.actions addObject:[DownloadAction actionWithBlock:pullCountriesBlock]; 
    // add other actions 
    // ... 
    [self fetchData]; 
} 

} 

-(void)fetchData{ 
    if(self.currentActionIndex >= self.actions.count){ 
      [self finishedFetchingData]; 
      return; 
    } 

    [self fetchDataForAction: self.actions[self.currentActionIndex] ]; 
} 

-(void)fetchDataForAction:(DownloadAction*)action 
     [self.myOperationQueueImplementation enqueueOperationWithBlock:action.block]; 
} 

如果下载成功,只是排队的下一个动作(递增currentActionIndex并调用fetchData)。如果失败,您可以采取相应措施。我要做的就是在第一次调用fetchData之前开始聆听有趣的NSNotificationCenter事件。您可以侦听UserDidLogInNotification或任何可能允许队列继续运行下载的其他任何事件。

相关问题