1

私は自分のアプリの起動を高速化しようとしています。そのために持っていたアイデアの1つは、非同期ディスパッチキューを使用することでした。私は2つのタスクを起動時に(実際には非常に大きなタスク)お互いの隣に実行することができますがあります。しかし、どちらもメインスレッド(主にUIコード)上で実行される重要な部分を持っています。メインスレッドで複数のGCDディスパッチ

dispatch_async(dispatch_get_main_queue, ^{ 
    [self doTask1]; 
}); 

dispatch_async(dispatch_get_main_queue, ^{ 
    [self doTask2]; 
    //Will task 2 take turns with task 1, or will task 2 start after 1 is finished? 
}); 

私の質問はこれです:私はこの例のように、ブート時に2 dispatch_async年代呼び出した場合、彼らは実行にターンを取る、または完全な最初のブロックは最初、その後、第二ブロックを実行しますか?

答えて

6

メインキューがシリアルキューです。シリアルキューに追加されたブロックは、追加された順に実行され、一度に1つずつ(シリアルに)実行されます。あなたの例では、task1が完了するまでtask2は起動しません。

これらを同時に実行する場合は、それらをグローバルな並行キューの1つにディスパッチする必要があります。

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(q, ^{/* this work may finish before other work added to this queue later */}); 
+0

シリアルキューの場合、なぜ非同期ディスパッチを呼び出すことができますか? –

+1

私はあなたの質問を理解していない、なぜあなたはできないだろうか? asyncはただブロックをエンキューすることを意味しますが、必ずしも結果を必要としないか、エンキューした現在の操作をブロックする必要がありません。それは別のスレッドで発生するか、すぐに開始する必要はありません。 –

+3

「非同期」と「同時」は同義語であるという誤解があるようです。私はそれがどこから来たのか分からないが、私はそれがスタックオーバーフロー全体を見る。 –

-2

1つは他のタスクの後に実行されますが、それらは同時に実行されます。つまり、task1が完了する前にtask2を実行できます。

チェック代替:

dispatch_async(dispatch_get_main_queue, ^{ 
    [self doTask1]; 
    dispatch_async(dispatch_get_main_queue, ^{ 
     [self doTask2]; 
     //Now task2 will execute after task1 
    }); 
}); 
+0

これにより、それらの順番で実行されることが保証されています。この例では、task2をtask1より前に終了させることができますか?注:私は最後の動作を探しています。 –

+0

はい、私の代わりに、あるタスクが他のタスクの後に始まることが保証されます。 – fbernardo

+3

メインキューは同時にタスクを実行しません –

関連する問題