8

重複の可能性:
dispatch_get_global_queue と dispatch_queue_create の違いは何ですか?

gcd を使用する方法がいくつかありますが、そのうちのいくつかは次のようにする場合があります。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(queue, ^{

    dispatch_sync(dispatch_get_main_queue(), ^{

    });
});

しかし、他の人は次のようにするかもしれません:

imageQueue_ = dispatch_queue_create("com.company.app.imageQueue", NULL);
dispatch_async(imageQueue_, ^{
        dispatch_async(dispatch_get_main_queue(), ^{

        });
    });

違いは何ですか?ウェブからたくさんの画像をダウンロードしたい場合、どちらが優れていますか?

4

2 に答える 2

20

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

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

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

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

戻すと、すべてのグローバル キューはコンカレントであり、すべてのユーザー キューは、コンカレントとして定義されていない限り、デフォルトでシリアルです。

画像をダウンロードすることが目的の場合は、おそらくシリアル (ユーザー) キューが必要です。画像のダウンロードは、帯域幅の問題です。通常、一度に 1 つ (または数個) だけ実行する必要があります。

編集:上記の回答を拡張したブログ投稿: http://amattn.com/2013/08/28/grand_central_dispatch_gcd_summary_syntax_best_practices.html

于 2012-12-16T07:17:49.660 に答える
3

GCD を使用するdispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);と、ジョブを処理するのに十分なスレッドが自動的に作成され、可能であれば複数のコアが使用されます。

一方、使用imageQueue_ = dispatch_queue_create("com.company.app.imageQueue", NULL);すると、シリアル キューと先入れ先出しの動作が得られます。

スレッド セーフやジョブが返される順序を気にしない場合は、最初の方法を使用してください。

于 2012-12-16T07:08:59.983 に答える