私が働いている会社の(ネットワーク)同期アレイを作成しようとしています。ネットワーキングの部分は正常に機能しますが、私は問題を詳しく調べました。
私の望みはdispatch_create_queue
を使用して新しいキューを作成し、メインスレッドで実行するためにnotの2つのブロックを追加しますが、シリアル方式で、最初のブロックは次に実行する必要があり、並行して実行することはできません。
私はAppleのドキュメントを読みましたが、控えめに言っても混乱します。
dispatch_queue_create
を使用してキューを作成し、dispatch_sync
を使用して(定義後)ブロックを追加すると、ブロックがまだメインスレッドで実行されていることがわかりました。
dispatch_async
を使用すると、ブロックがメインスレッドで実行されていないことになります。
dispatch_sync
を使用して両方のブロックを追加しようとすると、永久にブロックされます。
両方のブロックが正常に実行され、メインスレッドから外れているように見えるのは、dispatch_async
を呼び出すときだけです。
ただし、GCDと同期方法を選択した理由は、新しいキュー(つまり新しいスレッド)を作成していて、そのキューにブロックを追加すると、もう1つが実行を完了するまでブロックするだけだという印象を受けたからです。これはそうではありませんか、またはキューを作成しても、コードがメインスレッドで実行されないことは保証されませんか?
これはFIFO GCDのキューです:
dispatch_queue_t serialQueue = dispatch_queue_create("com.blah.queue", DISPATCH_QUEUE_SERIAL);
...
dispatch_async(serialQueue, ^{
//block1
});
dispatch_async(serialQueue, ^{
//block2
});