Ваши определения асинхронного и синхронного не совсем верны.
В Grand Central Dispatch вы рассматриваете очереди , а не потоков . Очередь - это либо очередь последовательной отправки, либо очередь одновременной отправки.
Очередь последовательной отправки может запускать одну задачу за раз, и задачи отправляются одна за другой (последовательно).
A Очередь одновременной отправки может одновременно выполнять несколько задач в нескольких потоках.
Задачи выполняются в потоках, а Grand Central Dispatch заботится о назначении задач для вас.
Основная очередь - это специальная последовательная диспетчеризация. очередь, которая только назначает задачи основному потоку. Другие очереди могут назначать задачи любому доступному потоку, включая основной поток.
Теперь для синхронной и асинхронной диспетчеризации разница состоит в том, блокирует ли диспетчеризация текущий поток до тех пор, пока отправленная задача не будет завершена (синхронно), или поставит в очередь задачу без блокировки текущего потока (асинхронно).
Когда вы отправляете асинхронно в основную очередь, вы предоставляете единицу работы, которую Grand Central Dispatch назначит основному потоку в будущем, но ваш код продолжает выполняться, не дожидаясь завершения этого отправленного элемента.
Вы можете отправлять асинхронные задачи в основную очередь, когда работаете в главной очереди довольно счастливо, поскольку отправленное задание будет выполнено позже, когда основная очередь будет готова для выполнения задачи.
Что вы не может выполнить диспетчеризацию синхронно в основную очередь из основной очереди (или, в более общем случае, синхронную отправку в любую очередь последовательной отправки из этой же очереди), поскольку вы создадите взаимоблокировку ,
Синхронная отправка блокирует текущий поток / очередь до тех пор, пока отправленный элемент не будет завершен. В очереди последовательной отправки отправленный элемент не может быть выполнен, поскольку очередь отправки заблокирована.