Можно ли делать main.sync с главного потока? Что будет?
Суть
Нельзя. DispatchQueue.main.sync { } блокирует текущий поток, пока главная очередь не выполнит блок. Но главная очередь привязана к главному потоку, который как раз и стоит в ожидании — классический дедлок sync на очередь, в которой уже находишься.
На практике приложение не зависает, а крашится: libdispatch знает, что главный поток владеет главной очередью, и прерывает процесс с EXC_BREAKPOINT и сообщением «BUG IN CLIENT OF LIBDISPATCH: dispatch_sync called on queue already owned by current thread». Та же проверка срабатывает для любой своей serial-очереди:
let queue = DispatchQueue(label: "serial")
queue.async {
queue.sync { } // sync на очередь, на которой уже выполняемся
}
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep