DispatchQueue.main.sync в методе обновления заголовка
func updateTitle() {
DispatchQueue.main.sync {
self.titleLabel.text = "Готово"
}
}
Метод вызывают из completion сетевого запроса, а в одном месте — прямо из обработчика нажатия кнопки. QA сообщает о полном зависании приложения, которое воспроизводится не всегда. Что происходит?
- sync на главной очереди безопасен всегда: GCD распознаёт текущую очередь и выполняет блок напрямую
- Зависание возможно только при вызове с фоновой очереди, потому что sync блокирует её до завершения блока
- Проблема в захвате self: sync удерживает контроллер и не даёт ему освободиться
- При вызове с главного потока main.sync ждёт сам себя — взаимная блокировка
