Why does observer for status change of AVAsset not work?

馋奶兔 提交于 2019-12-11 07:37:11

问题


I implemented the following code from Apple. It is meant to observe for a change in the status of a playerItem. The problem is that for some reason it does not work. The observe function does not run when ready.

All relevant code is below:

func preloadVideo(media: Media) {
  //setup code, and then:
   media.playerItem1!.addObserver(self,
                                   forKeyPath: #keyPath(AVPlayerItem.status),
                                   options: [.old, .new],
                                   context: &playerItemContext)

}

Observe method:

private var playerItemContext = 0

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

    if keyPath == #keyPath(AVPlayerItem.status) {
        let status: AVPlayerItem.Status

        // Get the status change from the change dictionary
        if let statusNumber = change?[.newKey] as? NSNumber {
            status = AVPlayerItem.Status(rawValue: statusNumber.intValue)!
        } else {
            status = .unknown
        }
        print("dsfdgddgdggdgdgdgddsafdsaf434fdfdg433444343")

        // Switch over the status
        switch status {
        case .readyToPlay:
            //Stop animation, and go to p3
            print("dsfdsafdsaf434433444343")

            if goToVideo {
                print("Runinfdsh sahkbdsfhbsadfbadsfl")
                goToP3()
            }

            break
        // Player item is ready to play.
        case .failed: break
        // Player item failed. See error.
        case .unknown: break
            // Player item is not yet ready.
        @unknown default: break
            //fatal error
        }
    }
}

This method will run first:

@objc func viewHandleTap(_ sender: UITapGestureRecognizer) {
    if selectedPost?.interimMedia.first?.imageURLString != nil || selectedPost?.interimMedia.first!.playerQueue?.status.rawValue == 1 {

        //do something
    } else {
        //status is 0 (video has not loaded yet)//load animation
        //this runs...
        goToVideo = true
    }
}

How can I make it work? Currently nothing in the observe method is printing.

If there is another method to accomplish this go ahead and post as answer.


回答1:


Try by updating addObserver options to [.old, .new, .initial, .prior].



来源:https://stackoverflow.com/questions/56470171/why-does-observer-for-status-change-of-avasset-not-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!