2016-11-17 4 views
2

以下の例のコードでは、エラーの場合はcomplete(false)を呼び出します。しかし、私はDispatchGroupオブジェクトを使用してすべての非同期要求が完了したことを確認しているので、notifyが呼び出され、complete(true)が含まれ、を返すべきときにこの関数がtrueを返すようにすると、失敗時にsyncGroup.leave()を呼び出すことはできません。失敗のために。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

どうすればループから抜けることができますか?残りのオブジェクトを「同期していない」状態にしていますか? '休憩 'は閉鎖の権利のために働かないだろうか? – toast

+0

できません。ループによって、非同期操作がトリガーされます。おそらく(タスクが使用する時間と 'unsynced'の数に依存して)、すべてのレジスタタスクは、最初に完了ブロックを呼び出す前にトリガされます。 'unsynced'の多くの項目で' for loop'の最初のコードとして 'if fail {break}'を追加することができます。 – shallowThought

+0

ああ、ありがとう。これらの要求は非同期ですが、1つまたは2つの要求の送信を節約する可能性があります。 – toast

関連する問題