42

長い操作 (解析、ネットワークへの接続など) のために複数のスレッドが必要な、やや複雑な iOS プログラムを作成しています。しかし、私は と の違いが何であるかについて混乱していdispatch_get_global_queueますdispatch_queue_create

どちらを使用する必要がありますか?一般的な違いを簡単に説明していただけますか? ありがとう。

4

3 に答える 3

71

ドキュメントで説明されているように、グローバルキューは、同時タスク(つまり、さまざまなタスクを非同期でディスパッチし、それらが同時に実行されれば完全に満足します)や、作成と作成の理論上のオーバーヘッドに遭遇したくない場合に適しています。自分のキューを破棄します。

シリアルキューが必要な場合(つまり、ディスパッチされたブロックを一度に1つずつ実行する必要がある場合)、独自のキューを作成すると非常に便利です。これは、各タスクが前のタスクに依存している場合や、複数のスレッドからの共有リソースとの対話を調整する場合など、多くのシナリオで役立ちます。

あまり一般的ではありませんが、並行キューと組み合わせてバリアを使用する必要がある場合は、独自のキューを作成することもできます。そのシナリオでは、並行キューを作成し(つまりdispatch_queue_createDISPATCH_QUEUE_CONCURRENTオプションを使用して)、そのキューと組み合わせてバリアを使用します。グローバルキューでバリアを使用しないでください。

私の顧問弁護士は、シリアルキューが必要な場合(またはバリアを使用する必要がある場合)、キューを作成することです。そうでない場合は、先に進んでグローバルキューを使用し、独自のキューを作成するオーバーヘッドを回避してください。


並行キューが必要であるが、同時に実行できる操作の数を制御したい場合NSOperationQueueは、プロパティを持つwhichの使用を検討することもできmaxConcurrentOperationCountます。これは、ネットワーク操作を行うときに、サーバーに送信される同時リクエストが多すぎないようにする場合に役立ちます。

于 2012-06-11T18:38:28.700 に答える
42

別の回答に投稿したばかりですが、かなり前に書いたものを次に示します。

キューを概念化する最良の方法は、最初に、非常に低いレベルでは、シリアルとコンカレントの 2 種類のキューしかないことを理解することです。

シリアル キューは一夫一婦制ですが、コミットされていません。各シリアル キューに多数のタスクを指定すると、一度に 1 つのスレッドのみを使用して、一度に 1 つずつ実行されます。コミットされていない側面は、シリアル キューがタスク間で別のスレッドに切り替わる可能性があることです。シリアル キューは、常にタスクが終了するのを待ってから、次のタスクに進みます。したがって、タスクは FIFO 順で完了します。を使用すると、シリアル キューを必要な数だけ作成できますdispatch_queue_create

メインキューは特別なシリアル キューです。コミットされていない他のシリアル キューとは異なり、多くのスレッドと "デート" しているが一度に 1 つだけであるという点で、メイン キューはメイン スレッドと "結合" され、すべてのタスクがそこで実行されます。メイン キューのジョブは、小さな操作によって UI やその他の重要な部分がブロックされないように、ランループで適切に動作する必要があります。すべてのシリアル キューと同様に、タスクは FIFO 順で完了します。

シリアル キューが一夫一婦制である場合、同時キューは無差別です。システムの負荷に応じて、利用可能な任意のスレッドにタスクを送信したり、新しいスレッドを作成したりします。それらは、異なるスレッドで同時に複数のタスクを実行する場合があります。グローバル キューに送信されるタスクは、スレッド セーフであり、副作用を最小限に抑えることが重要です。タスクは FIFO 順で実行のために送信されますが、完了の順序は保証されません。これを書いている時点では、同時キューは 3 つしかなく、それらを作成することはできませんdispatch_get_global_queue

編集: この回答を拡張したブログ投稿: http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html

于 2012-12-16T07:21:05.227 に答える
0

1 つは既存のグローバル キューを返し、もう 1 つは新しいグローバル キューを作成します。GCD を使用する代わりに、NSOperation とオペレーション キューの使用を検討します。詳細については、このガイドを参照してください。通常、操作を同時に実行したい場合は、独自のキューを作成し、その中に操作を入れます。

于 2012-06-11T18:07:21.570 に答える