Есть ли лучший способ следить за изменением значения ключа?

Мне интересно, действительно ли следующий лучший способ узнать, когда видео готово к воспроизведению: в настоящее время я делаю следующее: if currentMedia.playerQueue?.status.rawValue == 1 { я играю, else (видео еще не загружено) я покажу значок загрузки, а затем сделаю следующее, чтобы наблюдать когда видео будет готово к воспроизведению:

Я создаю AVPlayer, используя тот же URL-адрес видео, а затем, когда он готов, я вызываю метод playCurentMedia() для воспроизведения видео.

currentMedia.avPlayer = AVPlayer(url: currentMedia.videoURL!)

currentMedia.avPlayer!.addObserver(self, forKeyPath: "status", options: [.new, .initial], context: &P2SheetViewController.playerStatusContext)

Есть ли у этой стратегии недостатки? Или это хорошее решение?

Как я могу наблюдать за изменениями, чтобы показать видео, когда оно будет готово?

В настоящее время я могу настроить AVPlayer только рядом с очередью, чтобы я мог наблюдать за ее изменением...

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    print("observe KVO")
    // Only handle observations for the playerItemContext
    guard context == &P2SheetViewController.playerStatusContext else {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        return
    }

    if keyPath == #keyPath(AVPlayer.status) {
        let status: AVPlayer.Status
        if let statusNumber = change?[.newKey] as? NSNumber {
            status = AVPlayer.Status(rawValue: statusNumber.intValue)!
        } else {
            status = .unknown
        }

        //Switch over status value
        switch status {
        case .readyToPlay:
            print("READY TO PLAY")
            GlobalSharedData.shared.videoAllSetToGoMedia1 = true

            if GlobalSharedData.shared.p2Media1VideoWasNotReadyWhenPressedView {
                baseVC.playVideoControlForP2()
            }

            break
        // Player item is ready to play.
        case .failed:
            print(".UKNOWN")

            break
        // Player item failed. See error.
        case .unknown:
            print(".UKNOWN")

            break
            // Player item is not yet ready.
        }

    }
}

person Community    schedule 01.07.2019    source источник
comment
Действительно ли нормально отредактировать вопрос, чтобы заменить его совершенно не относящимся к делу вопросом?   -  person matt    schedule 07.07.2019
comment
Вопрос без ответа лучше удалить.   -  person matt    schedule 07.07.2019
comment
Я не понимаю, почему вы используете NSLayoutConstraint, если вы уже установили высоту и ширину, как этот UIView(frame: CGRect(x: 85, y: 0, width: self.frame.width-85, height: self.frame. высота)). А UITableView находится внутри labelView или ниже labelView?   -  person Habin Lama    schedule 07.07.2019
comment
Что происходит, когда вы создаете свой код? Сначала проверьте, меняет ли ваш labelView цвет фона, работает он или нет?   -  person Habin Lama    schedule 07.07.2019
comment
Примечание модератора. Пожалуйста, не заменяйте конкретный вопрос, который вы задали, совершенно другим и не относящимся к делу вопросом. Задайте вместо этого новый вопрос.   -  person Bhargav Rao    schedule 07.07.2019


Ответы (1)


Согласно официальной документации AVPlayer, есть два подхода, которые можно использовать для наблюдения за действиями игрока. государство:

Общее наблюдение за состоянием. Вы можете использовать наблюдение за ключом-значением (KVO) для наблюдения за изменениями состояния многих динамических свойств проигрывателя, таких как его currentItem или скорость воспроизведения. Вы должны зарегистрироваться и отменить регистрацию для получения уведомлений об изменениях KVO в основном потоке. Это позволяет избежать возможности получения частичного уведомления при внесении изменений в другой поток. AVFoundation вызывает observeValue(forKeyPath:of:change:context:) в основном потоке даже при выполнении операции изменения в другом потоке.

Наблюдения за состоянием во времени: KVO хорошо подходит для наблюдения за общим состоянием, но не предназначен для наблюдения за постоянно меняющимся состоянием, таким как время игрока. AVPlayer предоставляет два метода наблюдения за изменениями времени:

  • addPeriodicTimeObserver(forInterval:queue:using:)
  • addBoundaryTimeObserver(forTimes:queue:using:)

Эти методы позволяют вам наблюдать изменения времени либо периодически, либо по границе, соответственно. Когда происходят изменения, вызывайте блок обратного вызова или замыкание, которое вы предоставляете этим методам, чтобы дать вам возможность выполнить какое-либо действие, например обновить состояние пользовательского интерфейса вашего проигрывателя.

Также см. свойство статуса AVPlayer:

Статус плеера не указывает на его готовность сыграть конкретный предмет плеера. Вместо этого вы должны использовать свойство status AVPlayerItem, чтобы сделать это определение.

Итак, если вы хотите знать, когда конкретное видео загружено и готово к воспроизведению, вы должны создать AVPlayerItem и наблюдать за его свойством status. Когда носитель элемента проигрывателя загружен и готов к использованию, его статус изменится на AVPlayerItem.Status.readyToPlay.

person Alex D.    schedule 26.07.2019