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

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

Ответ

Анимации в UIKit выполняются не на главном потоке, а в отдельном потоке рендеринга (render server), управляемом фреймворком Core Animation.

Причины:

  1. Архитектура Core Animation: Изменения анимируемых свойств (например, frame, alpha) фиксируются в модели слоев (model layer). Затем система рендеринга (render server) в отдельном процессе берет эти изменения и интерполирует кадры независимо от состояния главного потока приложения.
  2. CADisplayLink: Этот таймер, синхронизированный с частотой обновления экрана, также планируется в общий run loop (RunLoop.common), а не только в главный.

Пример:

// Анимация запускается
UIView.animate(withDuration: 5.0) {
    myView.center.y += 200
}
// Блокировка главного потока НЕ остановит анимацию
Thread.sleep(forTimeInterval: 3.0) // Анимация продолжит выполняться

Важное ограничение: Хотя анимация будет отрисовываться, пользовательские взаимодействия (тапы, жесты) и обновление неанимируемого UI обрабатываются на главном потоке, поэтому они будут недоступны на время блокировки.