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()
}
}
これは私のためには機能しません。 "fetchGroup.notify(queue:queue)"の代わりに私の "fetchGroup.notify(queue:DispatchQueue.main)"のために働いていたnotifyメソッドのキューを変更しました。しかし、.emailと.otherの両方が呼び出されると、ループは実行されませんでした。私が誰かを更新しても、それはうまく動作します。任意の提案をお願いします。 – venky
@venky、ありがとうございます。私はさらに調査するために時間を取るでしょう。 – OOPer
@venky、私は私のコードが期待どおりに動作することを発見しただけでなく、元のコードが動作することを発見しました。私は推測で多くの欠けている部分を埋めるので、それらの部分は影響を受けていますが、あなたがそれらのすべてを隠しているので、私はこれ以上言い表すことができません。しばらく時間がかかる場合は、問題を再現できる最小限のプロジェクトを作成し、すべてのコード(編集済みのスニペットではありません)を表示してください。 – OOPer