2013-10-04 86 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或任何可能允許隊列繼續運行下載的其他任何事件。

相關問題