31

勤務先の会社用に (ネットワーク) 同期アレイを作成しようとしています。ネットワーキング部分は正常に動作しますが、私は問題に悩まされています。

私の望みは、 を使用して新しいキューを作成することでした。これに、メイン スレッドで実行されないdispatch_create_queue2 つのブロックをシリアルに追加します。つまり、最初に最初のブロックが実行され、次に 2 番目のブロックが実行され、決して実行されることはありません。平行。

Apple のドキュメントを読みましたが、控えめに言ってもわかりにくいです。

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

  • を使用するdispatch_async場合、それはブロックがメインスレッドで実行されていないときです。

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

  • 両方のブロックが正常に実行され、メイン スレッドから離れているように見えるのは、dispatch_async.

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

4

1 に答える 1

63

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

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

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

dispatch_async(serialQueue, ^{
    //block2
});
于 2013-01-02T20:39:39.143 に答える