23

私が働く会社の(ネットワーク)同期アレイを作成しようとしています。ネットワーキングの部分は正常に動作しますが、私は問題を抱えています。GCDを使用したFIFOシリアルキュー

私の願いは、私はは、メインスレッド上で実行しないある二つのブロックを追加するためのdispatch_create_queue使用して、新しいキューを作成することでしたが、シリアルに、最初の最初のブロックが実行しなければならないことを意味します第二のものであり、決して並行していない。

私はリンゴのドキュメントを読んだことがありますが、それほど難しいとは言いません。

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

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

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

  • 両方のブロックが正常に動作してメインスレッドから離れている唯一の時間は、dispatch_asyncを呼び出すときです。

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

答えて

50

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

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

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

dispatch_async(serialQueue, ^{ 
    //block2 
}); 
+0

だから、その後、dispatch_syncとは何の関係もありませんか?作成時に使用されたフラグのみ? –

+5

dispatch_asyncは、ディスパッチコール自体がブロックが終了するまでブロックしないようにします。 dispatch_syncを使用している場合、タスク自体はキュー内のどのスレッドでも実行されますが、タスクが完了するまで現在のスレッドをブロックします。私はそれがあなたが必要としているとは思わない。 –

+0

ありがとうございます。これらのAPI名はちょっと混乱しています。私の日を救った! :) –

関連する問題