Для видео, которое должно играть только на активном экране, разумная база — 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 остаётся страховкой очистки, не основным событием паузы.