Почему ActivityIndicator в UIKit продолжает анимацию после остановки в дебаггере?

«Почему ActivityIndicator в UIKit продолжает анимацию после остановки в дебаггере?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ActivityIndicator продолжает анимацию после паузы в дебаггере, потому что анимация управляется системным уровнем (Core Animation) и не зависит от выполнения кода в главном потоке. Когда дебаггер приостанавливает выполнение, главный поток блокируется, но запланированные анимации в CALayer продолжают выполняться.

Техническая причина:

  • Анимация UIActivityIndicatorView реализована через CAAnimation в отдельном потоке рендеринга.
  • Команда stopAnimating() лишь устанавливает флаг и планирует обновление слоя, которое не может выполниться при заблокированном главном потоке.

Пример проблемы:

activityIndicator.startAnimating()
// Точка останова дебаггера
activityIndicator.stopAnimating() // Этот код не выполняется

Решение:

  1. Вызовите stopAnimating() при возобновлении работы приложения:
    NotificationCenter.default.addObserver(
        forName: UIApplication.didBecomeActiveNotification,
        object: nil,
        queue: .main
    ) { _ in
        activityIndicator.stopAnimating()
    }
  2. Используйте флаг для ручного управления состоянием в viewWillAppear/viewDidDisappear.