1

アカウント番号のリストを繰り返し処理し、これらのアカウントの詳細情報を取得してから、集計された情報を 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 のサンプル プロジェクトへのリンクは次のとおりです (コードが多すぎてここに配置できません)。

https://github.com/kwylez/ThreadingHell

4

2 に答える 2

0

(私はあなたのプロジェクトをまだダウンロードしていません。電話で応答します。申し訳ありません...)

代わりに NSOperationQueue を使用してください。各操作を完了操作の依存関係として追加します。

これは、はるかにクリーンで、よりココアに似た API です。NSBlockOperation を使用して、現在 GCD に使用しているのと同じブロックを渡すことができるため、あまり変更する必要はありません。

于 2012-10-28T18:56:32.600 に答える
0

最新のコードコミット

私が行った最後のコメントの問題を修正します。したがって、私の質問はdispatch_groupメソッドを使用して回答されます。

getAccountDetailsForAccountNumber:completionBlockメソッドで、呼び出しを削除し、メソッドdispatch_group_notify内の「完了」ブロック ログインを移動しましたdispatch_group_async。これにより、完了ブロックがキュー タスクから切り離され、通知が後で同時通知を受信する前とは対照的にgetAccountListMetaInformation:、コマンドに「従う」必要があるため、問題が修正されます。dispatch_group_wait

于 2012-10-28T20:45:08.963 に答える