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