web-dev-qa-db-ja.com

FIFO GCDを使用したシリアルキュー

私が働いている会社の(ネットワーク)同期アレイを作成しようとしています。ネットワーキングの部分は正常に機能しますが、私は問題を詳しく調べました。

私の望みはdispatch_create_queueを使用して新しいキューを作成し、メインスレッドで実行するためにnotの2つのブロックを追加しますが、シリアル方式で、最初のブロックは次に実行する必要があり、並行して実行することはできません。

私はAppleのドキュメントを読みましたが、控えめに言っても混乱します。

  • dispatch_queue_createを使用してキューを作成し、dispatch_syncを使用して(定義後)ブロックを追加すると、ブロックがまだメインスレッドで実行されていることがわかりました。

  • dispatch_asyncを使用すると、ブロックがメインスレッドで実行されていないことになります。

  • dispatch_syncを使用して両方のブロックを追加しようとすると、永久にブロックされます。

  • 両方のブロックが正常に実行され、メインスレッドから外れているように見えるのは、dispatch_asyncを呼び出すときだけです。

ただし、GCDと同期方法を選択した理由は、新しいキュー(つまり新しいスレッド)を作成していて、そのキューにブロックを追加すると、もう1つが実行を完了するまでブロックするだけだという印象を受けたからです。これはそうではありませんか、またはキューを作成しても、コードがメインスレッドで実行されないことは保証されませんか?

29
Ælex

これはFIFO GCDのキューです:

dispatch_queue_t serialQueue = dispatch_queue_create("com.blah.queue", DISPATCH_QUEUE_SERIAL);

...
dispatch_async(serialQueue, ^{
    //block1
});

dispatch_async(serialQueue, ^{
    //block2
});
60
Fernando Mazzon