私はディスパッチグループを使用してデータ文字列を取得しています。ここにコードがあり、私はなぜこのコードでUnbalanced call to dispatch_group_leave()
が得られるのか分かりません。ループ用の複製でdispatch_group_leave()への不均衡な呼び出し
var queue = DispatchQueue(label: "extractStringQueue", attributes: .concurrent)
queue.async {
let m_group = DispatchGroup()
let weeks = self.weekDataArray
for week in weeks {
for day in week.dayDataArray {
m_group.enter()
day.processStringData(dataName, completionHandler: { (data, response, error) in
if true {
// Process
m_group.leave()
}
})
}
}
m_group.notify(queue: queue, execute: {
// CompletionHandler
})
}
興味深い説明非常によく説明しますが、私はあなたの第3のポイントを得ることができませんでした。あなたが知っていると多くのことを説明することができますか? –
@myc-alter:本当に確かではありません:)通常は、完了ブロックを実行する前にメインスレッドに切り替えるプラクティスは、関数パラメータとして渡されます。実際のネットワークコールはバックグラウンドスレッドで発生しますが、サーバの応答を返す前にalamofireと同様にAFNetworkingがこれらのサードパーティフレームワークで実行されます。彼らが行うことは、DispatchQueue.main.async {completion()}内のcompletion()コールを囲むことです。ディスパッチグループが内部でセマフォースイッチングスレッドを使用しているため、スレッドスイッチが発生します。これは –
のように、入力および退出のコールが不均衡になる可能性があります。ちょうど推測 –