Когда вы отправляете задачу с .sync()
, текущий поток (независимо от того, какой именно) должен ждать, пока задача не будет завершена, потому что это точка .sync()
. Учитывая, что поток заблокирован от продолжения, после того, как очереди, в которую он был отправлен, разрешено выполнять задачу, он фактически будет работать прямо в потоке, который вызвал .sync()
. GCD не нужно набирать поток из пула потоков, потому что есть известный поток. (Это не гарантируется как таковое. Это оптимизация. Но это объясняет, почему в вашем первом фрагменте все задачи выполняются в главном потоке.)
В вашем втором фрагменте, однако, моя фраза "однажды Очередь […] разрешено запускать задание »вступает в силу. В основной очереди уже выполняется что-то: вызов queue1.sync()
. Основная очередь не может запускать другую задачу до тех пор, пока она не завершится, потому что она последовательная. (Обратите внимание, что основная очередь и основной поток, хотя и тесно связаны, не одно и то же.) Поэтому задача, выполняемая в главной очереди, блокируется, ожидая завершения задачи, выполняющейся в главной очереди. Следовательно, тупик.