2016-11-17 147 views
2

在我下面的示例代碼中,我會在失敗時調用complete(false)。但是,由於我使用的是DispatchGroup對象來確保所有異步請求都已完成,因此我不能僅僅調用syncGroup.leave(),因爲將調用notify,其中包含complete(true),因此該函數返回true,因此應返回false失敗。如何使用DispatchGroup在for循環內進行異步調用

我在沒有正確地完成我的功能時沒有調用syncGroup.leave()正確嗎?或者我應該打電話syncGroup.leave(),並以某種方式試圖確定結果是什麼,所以我可以返回false失敗?

let syncGroup = DispatchGroup() 
syncGroup.enter() 
for track in unsynced { 
    register(time: time, withCompletion: { (success: Bool) ->() in 

     if success { 
      self.debug.log(tag: "SyncController", content: "Registered") 
      syncGroup.leave() 
     } 
     else { 
      complete(false) 
     } 
    }) 
} 

//all requests complete 
syncGroup.notify(queue: .main) { 
    self.debug.log(tag: "SyncController", content: "Finished registering") 
    complete(true) 
} 
+0

因爲你分派很多任務,但只返回一個狀態你的方法是有缺陷的。你需要考慮你想達到什麼;也許你應該準備好接收多個回調函數(可能傳遞'track'以及true/false結果),或者調用回調函數一次,但傳遞一系列軌道/狀態 – Paulw11

回答

2

您必須在您的for循環中輸入該組。你可能想引入一個額外的錯誤標誌。

實現示例:

var fail = false 
    let syncGroup = DispatchGroup() 

    for track in unsynced { 
     syncGroup.enter() 
     register(time: time, withCompletion: { (success: Bool) ->() in 

      if success { 
       self.debug.log(tag: "SyncController", content: "Registered") 
       syncGroup.leave() 
      } 
      else { 
       fail = true 
       syncGroup.leave() 
      } 
     }) 
    } 

    //all requests complete 
    syncGroup.notify(queue: .main) { 
     if fail { 
      complete(false) 

     } else { 
      self.debug.log(tag: "SyncController", content: "Finished registering") 
      complete(true) 
     } 
    } 
+0

如何退出該循環通過'unsynced'中剩餘的對象? 「休息」不會工作,因爲它在關閉權? – toast

+0

你不能。循環觸發你的異步操作。很可能(取決於任務使用的時間以及「未同步」的數量),所有註冊任務在首次調用完成塊之前觸發。對於'unsynced'中的很多項目,您可以在'for循環'中添加'if fail {break}'作爲第一個代碼。 – shallowThought

+0

好的,謝謝。雖然這些請求是異步的,但它可能會節省一到兩個請求的發送時間。 – toast