sync блокирует текущий поток до выполнения блока; sync на ту же serial queue, особенно main, из неё же приводит к deadlock.
Разбор
- Из background sync(main) для мелкого UI иногда допустим, но async предпочтительнее.
- Вложенные sync на serial рискованны.
- Лишние sync дают фризы, видимые в профилере.
- Thread assumptions API стоит документировать.
Итог
sync плюс неправильная очередь = deadlock или фризы.