メインキューへのブロックのディスパッチは通常、バックグラウンドキューから行われ、バックグラウンド処理が終了したことを通知します。
- (void)doCalculation
{
//you can use any string instead "com.mycompany.myqueue"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(backgroundQueue, ^{
int result = <some really long calculation that takes seconds to complete>;
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult:result];
});
});
}
この場合、バックグラウンドキューで時間のかかる計算を行っており、計算が完了したらUIを更新する必要があります。通常、UIの更新はメインキューから行う必要があるため、2番目にネストされたdispatch_asyncを使用して、メインキューに「シグナル」で返します。
メインキューにディスパッチする例はおそらく他にもありますが、通常はこの方法で行われます。つまり、バックグラウンドキューにディスパッチされたブロック内からネストされます。
- バックグラウンド処理が完了-> UIを更新
- バックグラウンドキューで処理されたデータのチャンク->メインキューに次のチャンクを開始するよう通知
- バックグラウンドキューの受信ネットワークデータ->メッセージが到着したことをメインキューに通知
- などなど
なぜメインキューからメインキューにディスパッチしたいのかについては、まあ、通常は実行しないでしょう。ただし、実行ループの次の時間に実行する作業をスケジュールするために実行することは考えられます。