2016-09-22 13 views
0

以下は、私が使用しているコードconcurrent API呼び出しです。どういうわけかこのメソッドは何回も返されます。私はDispatchGroupなしでテストしました、それは期待どおりに動作しています。なぜそれが何度も呼び出されているのを見いだすのを助けてください。DispatchGroupが複数回返す

マイコードスニペット:enter()すべてにあなたが必要

 func makeConcurrentCallForUpdating(_ parent: Parent, 
         completionBlock: @escaping (_ success: Bool, _ error: DescriptiveErrorType?) -> Void) 
     let fetchGroup = DispatchGroup() 
     let queue = DispatchQueue.global(qos: .default) 
     let endPoints = [.email, .others ] 
     DispatchQueue.concurrentPerform(iterations: endPoints.count) { (index) in 
      let enumType = endPoints[index] 
      switch enumType { 
      case .email: 
       updateEmail(parent, fetchGroup: fetchGroup, completionBlock: completionBlock) 
      case .others: 
       update(parent, fetchGroup: fetchGroup, completionBlock: completionBlock) 
      default: 
      break 
     } 
     } 

     fetchGroup.notify(queue: queue) { 
      if self.endPoints.count > 0 { 
       completionBlock(false, error) 
      } else { 
      self.saveUpdated(parent, completionBlock: completionBlock) 
     } 
     } 
    } 

    #MARK: EMAIL CALL 
     fileprivate func updateEmail(_ parent: Parent, 
          fetchGroup: DispatchGroup, 
          completionBlock: @escaping (_ success: Bool, _ error: DescriptiveErrorType?) -> Void) { 
     fetchGroup.enter() 
     updateEmail(parent: parent) { (success, error) in 
      fetchGroup.leave() 
     } 
    } 

答えて

0

はグループ意志leave()のいずれかのタスクの前にタスクを派遣しました。

あなた fetchGroup.enter()

DispatchQueue.concurrentPerform(...
let endPoints = [.email, .others ] 
    endPoints.forEach {_ in fetchGroup.enter()} //<- add this line 
    DispatchQueue.concurrentPerform(iterations: endPoints.count) { (index) in 

を移動し、各タスクにfetchGroup.enter()を削除

:試してみてください

fileprivate func updateEmail(_ parent: Parent, 
         fetchGroup: DispatchGroup, 
         completionBlock: @escaping (_ success: Bool, _ error: DescriptiveErrorType?) -> Void) { 
    //fetchGroup.enter() //<- remove this line, in your `update(...)` as well 
    updateEmail(parent: parent) { (success, error) in 
     fetchGroup.leave() 
    } 
} 

を。

+0

これは私のためには機能しません。 "fetchGroup.notify(queue:queue)"の代わりに私の "fetchGroup.notify(queue:DispatchQueue.main)"のために働いていたnotifyメソッドのキューを変更しました。しかし、.emailと.otherの両方が呼び出されると、ループは実行されませんでした。私が誰かを更新しても、それはうまく動作します。任意の提案をお願いします。 – venky

+0

@venky、ありがとうございます。私はさらに調査するために時間を取るでしょう。 – OOPer

+0

@venky、私は私のコードが期待どおりに動作することを発見しただけでなく、元のコードが動作することを発見しました。私は推測で多くの欠けている部分を埋めるので、それらの部分は影響を受けていますが、あなたがそれらのすべてを隠しているので、私はこれ以上言い表すことができません。しばらく時間がかかる場合は、問題を再現できる最小限のプロジェクトを作成し、すべてのコード(編集済みのスニペットではありません)を表示してください。 – OOPer

関連する問題