Определение оптимального места для запуска и остановки пользовательского видеоплеера

Для видео, которое должно играть только на активном экране, разумная база — play в viewDidAppear и pause в viewWillDisappear. Потребуются также события активности приложения.

Короткий ответ

Что ответить на собеседовании

Для видео, которое должно играть только на активном экране, разумная база — play в viewDidAppear и pause в viewWillDisappear. Потребуются также события активности приложения.

Подробный разбор

Ответ с пояснениями

Условие

В проекте есть собственный видеоплеер, реализованный в виде класса с методами play() и pause(). Необходимо решить, в какие методы жизненного цикла UIViewController следует вызывать эти методы, чтобы видео воспроизводилось корректно.

class CustomVideoPlayerView {
    func play() { /* ... */ }
    func pause() { /* ... */ }
}

class VideoContainerVC: UIViewController {
    // Без звука, зацикленное воспроизведение, ресурс берётся из bundle приложения
    var playerView: CustomVideoPlayerView // play / pause

    // Вариант 1
    func viewDidLoad() { /* play */ }
    deinit { /* pause */ }

    // Вариант 2
    func viewWillAppear(_ animated: Bool) { /* play */ }
    func viewDidDisappear(_ animated: Bool) { /* pause */ }

    // Вариант 3
    func viewDidAppear(_ animated: Bool) { /* play */ }
    func viewWillDisappear(_ animated: Bool) { /* pause */ }

    func buttonTapped() {
        // navigationController?.pushViewController(SecondVC(), animated: true)
    }
}

Вопрос: в каком из перечисленных методов жизненного цикла лучше инициировать воспроизведение (play) и где останавливать (pause) видеопоток? Обоснуйте выбор с учётом сценариев переходов между экранами и возможных утечек ресурсов.

Ответ

Для видео, которое должно играть только на активном экране, разумная база — play в viewDidAppear и pause в viewWillDisappear. Потребуются также события активности приложения.

Вариант 1 неверно связывает воспроизведение с загрузкой view и deinit: контроллер может долго оставаться в navigation stack вне экрана. Вариант 3 останавливает видео уже при начале ухода и запускает после полного появления. Если нужен фон во время перехода, вариант 2 тоже допустим, но это сознательная UX-политика. Учтите отменённый интерактивный переход, уход сцены в фон и перекрывающие экраны. Play/pause должны быть идемпотентны; deinit остаётся страховкой очистки, не основным событием паузы.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее