Отправка блока в основную очередь обычно выполняется из фоновой очереди, чтобы показать, что некоторая фоновая обработка завершена, например
- (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];
});
});
}
В этом случае мы выполняем длительные вычисления в фоновой очереди и должны обновить наш пользовательский интерфейс после завершения расчета. Обновление пользовательского интерфейса обычно должно выполняться из основной очереди, поэтому мы «сигнализируем» обратно в главную очередь, используя второй вложенный dispatch_async.
Возможно, есть и другие примеры, когда вы можете захотеть отправить обратно в основную очередь, но обычно это делается таким образом, то есть вложено в блок, отправленный в фоновую очередь.
- фоновая обработка завершена -> обновить пользовательский интерфейс
- кусок данных, обрабатываемых в фоновой очереди -> сигнализировать основной очереди, чтобы начать следующий блок
- входящие данные сети в фоновой очереди -> сигнализируют основной очереди, что сообщение пришло
- и т. д.
Что касается того, почему вы можете захотеть отправлять в основную очередь из главной очереди ... Ну, вы, как правило, этого не сделаете, хотя возможно, что вы могли бы сделать это, чтобы запланировать какую-то работу, которая будет выполняться в следующий раз в цикле выполнения.