С DispatchQueue.sync Документация:
... эта функция не возвращается, пока блок не закончится. Вызов этой функции и ориентация на текущую очередь приводят к тупику.
Вы уже находитесь в главной очереди, и вы заставляете код выполняться синхронно в главной очереди. Тот факт, что вы находитесь в основной очереди, означает, что никакой другой код не может быть выполнен в очереди прямо сейчас, однако sync
ожидает, пока этот код не будет выполнен, поэтому вы блокируете очередь и все ваше приложение.