Вступить в клуб →
средняявопросСеть, данные и конкурентность

DispatchQueue.main.sync в методе обновления заголовка

func updateTitle() {
    DispatchQueue.main.sync {
        self.titleLabel.text = "Готово"
    }
}

Метод вызывают из completion сетевого запроса, а в одном месте — прямо из обработчика нажатия кнопки. QA сообщает о полном зависании приложения, которое воспроизводится не всегда. Что происходит?

  • sync на главной очереди безопасен всегда: GCD распознаёт текущую очередь и выполняет блок напрямую
  • Зависание возможно только при вызове с фоновой очереди, потому что sync блокирует её до завершения блока
  • Проблема в захвате self: sync удерживает контроллер и не даёт ему освободиться
  • При вызове с главного потока main.sync ждёт сам себя — взаимная блокировка

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела