アカウント番号のリストを繰り返し処理し、これらのアカウントの詳細情報を取得してから、集計された情報を completionBlock に渡す必要があるシナリオがあります。これを容易にするために、dispatch_group_* メソッドを使用しています。残念ながら、明示的に呼び出したにもかかわらず、グループが終了する前に完了ブロックが呼び出されています
dispatch_group_wait(_imfDispatchGroup, DISPATCH_TIME_FOREVER);
コンソールログの例 (オリジナル):
2012-10-28 13:58:46.722 ログイン応答内の ThreadingHell[81909:303]
2012-10-28 13:58:46.724 ThreadingHell[81909:303] obj のアカウント ループ内: account1
2012-10-28 13:58:46.724 ThreadingHell[81909:303] obj のアカウント ループ内: account2
2012-10-28 13:58:46.724 ThreadingHell[81909:1b03] 内部詳細: L0i6kRVzGG 詳細
2012-10-28 13:58:46.724 ThreadingHell[81909:1a03] 内部の詳細: SE0QjhO8Hh 詳細
2012-10-28 13:58:46.724 ThreadingHell[81909:303] obj のアカウント ループ内: account3
2012-10-28 13:58:46.725 ThreadingHell[81909:1a03] __66 の内部完了-[ModelManager getAccountDetailsForAccountNumber:completionBlock:]_block_invoke_015
2012-10-28 13:58:46.725 ThreadingHell[81909:1803] 内部詳細: 9SsGYOX3u5 詳細
2012-10-28 13:58:46.725 ThreadingHell[81909:1a03] アカウントの詳細が見つかりました
2012-10-28 13:58:46.725 ThreadingHell[81909:303] obj のアカウント ループ内: account4
2012-10-28 13:58:46.725 ThreadingHell[81909:1b03] __66 の内部完了-[ModelManager getAccountDetailsForAccountNumber:completionBlock:]_block_invoke_015
2012-10-28 13:58:46.726 ThreadingHell[81909:1803] __66 の内部完了-[ModelManager getAccountDetailsForAccountNumber:completionBlock:]_block_invoke_015
2012-10-28 13:58:46.726 ThreadingHell[81909:303] obj のアカウント ループ内: acount5
2012-10-28 13:58:46.726 ThreadingHell[81909:1a03] 成功アカウント ループ
2012-10-28 13:58:46.726 ThreadingHell[81909:1b03] アカウントの詳細が見つかりました
2012-10-28 13:58:46.726 ThreadingHell[81909:2303] 内部詳細: wSXis5bIVs 詳細
2012-10-28 13:58:46.728 ThreadingHell[81909:1803] アカウントの詳細が見つかりました
2012-10-28 13:58:46.728 ThreadingHell[81909:2403] 内部詳細: SrIfbzBLr7 詳細
2012-10-28 13:58:46.728 ThreadingHell[81909:1a03] accountDetails の現在のインスタンス: (「L0i6kRVzGG 詳細」)
2012-10-28 13:58:46.728 ThreadingHell[81909:1803] 成功アカウント ループ
2012-10-28 13:58:46.728 ThreadingHell[81909:1b03] 成功アカウント ループ
2012-10-28 13:58:46.729 ThreadingHell[81909:2403] __66 の内部完了-[ModelManager getAccountDetailsForAccountNumber:completionBlock:]_block_invoke_015
2012-10-28 13:58:46.729 ThreadingHell[81909:303] !!!!!!!!!! 完了ブロックを呼び出そうとしています。これで最後にすべき
2012-10-28 13:58:46.729 ThreadingHell[81909:2303] __66 の内部完了-[ModelManager getAccountDetailsForAccountNumber:completionBlock:]_block_invoke_015
2012-10-28 13:58:46.730 ThreadingHell[81909:1803] accountDetails の現在のインスタンス: (「L0i6kRVzGG の詳細」、「9SsGYOX3u5 の詳細」)
2012-10-28 13:58:46.730 ThreadingHell[81909:1b03] accountDetails の現在のインスタンス: (「L0i6kRVzGG の詳細」、「9SsGYOX3u5 の詳細」、「SE0QjhO8Hh の詳細」)
2012-10-28 13:58:46.731 ThreadingHell[81909:2403] アカウントの詳細が見つかりました
2012-10-28 13:58:46.731 ThreadingHell[81909:2303] アカウントの詳細が見つかりました
2012-10-28 13:58:46.732 ThreadingHell[81909:2403] 成功アカウント ループ
2012-10-28 13:58:46.731 ThreadingHell[81909:303] obj: {}
2012-10-28 13:58:46.732 ThreadingHell[81909:2303] 成功アカウント ループ
2012-10-28 13:58:46.732 ThreadingHell[81909:303] エラー: (null)
2012-10-28 13:58:46.732 ThreadingHell[81909:2403] accountDetails の現在のインスタンス: (「L0i6kRVzGG の詳細」、「9SsGYOX3u5 の詳細」、「SE0QjhO8Hh の詳細」、「wSXis5bIVs の詳細」)
// 最新のコミットから更新されたログ [https://github.com/kwylez/ThreadingHell/tree/80cc29fab142b4dc1f386df747c5142b28e2dd84]
1b03] accountDetails の現在のインスタンス: (「CP3ioYdvXp 詳細」、「6k635XoJOV 詳細」、「2TjGF1fdaZ 詳細」、「0YiuX9gHsu 詳細」、「9RcyOfjRa5 詳細」) 2012-10-28 16:32:39.008 ThreadingHell[83171:303] ! !!!!!!!!! 完了ブロックを呼び出そうとしています。これは最後でなければなりません 2012-10-28 16:32:39.009 ThreadingHell[83171:303] obj: { } 2012-10-28 16:32:39.009 ThreadingHell[83171:303] エラー: (null)
私が見逃した「操作の順序」は何ですか?
github のサンプル プロジェクトへのリンクは次のとおりです (コードが多すぎてここに配置できません)。