Ios 发出「;func observeValueForKeyPath(键路径:NSString,对象:AnyObject,更改:NSDictionary,上下文:Void)";迅速地

Ios 发出「;func observeValueForKeyPath(键路径:NSString,对象:AnyObject,更改:NSDictionary,上下文:Void)";迅速地,ios,swift,avplayer,swift2,Ios,Swift,Avplayer,Swift2,我已经为这样一个AVP玩家添加了一个观察者 self.audioPlayer.addObserver(self, forKeyPath: "currentItem.status", options: [NSKeyValueObservingOptions.New, NSKeyValueObservingOptions.Initial], context: nil) 打电话 func observeValueForKeyPath(keyPath : NSString, object : AnyO

我已经为这样一个AVP玩家添加了一个观察者

self.audioPlayer.addObserver(self, forKeyPath: "currentItem.status", options: [NSKeyValueObservingOptions.New, NSKeyValueObservingOptions.Initial], context: nil)
打电话

func observeValueForKeyPath(keyPath : NSString, object : AnyObject, change : NSDictionary, context : Void) {
    if object as! AVPlayer == self.audioPlayer && keyPath.isEqualToString("currentItem.status")
    {
        let playerStatus = self.audioPlayer.currentItem!.status.rawValue as Int
        if playerStatus == AVPlayerStatus.Failed.rawValue
        {
            self.replaceCurrentItem(self.fileName)
        }
        else if playerStatus == AVPlayerStatus.ReadyToPlay.rawValue
        {
            self.playAudio()
            self.updateDurationPeriodcally()
            self.updateInfo()
        }
        else if playerStatus == AVPlayerStatus.Unknown.rawValue
        {
            print("\(self.audioPlayer.currentItem!.error)")
        }
    }
}
问题是从未调用过
observeValueForKeyPath

全部代码

func loadPlayer (urlString : NSString)
{
    let url : NSURL = NSURL(string: urlString as String)!

    let length = (url.absoluteString).characters.count as Int

    if length == 0
    {
        return
    }

    let asset = AVURLAsset(URL: url, options: nil)
    let anItem = AVPlayerItem(asset: asset)
    self.audioPlayer = AVPlayer(playerItem: anItem)
    self.audioPlayer.volume = 1.0
    self.audioPlayer.play()

    addObserver(self,
        forKeyPath: ObservatingKeyPath,
        options: NSKeyValueObservingOptions.New,
        context: PlayerStatusObservingContext)

    self.audioPlayer.addObserver(self, forKeyPath: "currentItem.status", options: [NSKeyValueObservingOptions.New, NSKeyValueObservingOptions.Initial], context: nil)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "itemDidFinishPlaying:", name:AVPlayerItemDidPlayToEndTimeNotification, object: nil)
}

你如何观察玩家物品。这可能是因为您可能观察不正确。下面是一个简单的插图,说明如何正确观察AVPlayer的状态

class TestViewController: UIViewController
{
    private var player: AVPlayer!
    private var playingIndex = 0

    private var songs = ["UpTown.mp3", "TurnMeOn.mp3"]

    private let ObservatingKeyPath = "currentItem.status"

    private let PlayerStatusObservingContext = UnsafeMutablePointer<Int>(bitPattern: 1)


    override func viewDidLoad()
    {
        super.viewDidLoad()

        createPlayer()
        setupGestures()

        playNext()
    }

    func createPlayer()
    {
        player = AVPlayer()
        player.addObserver(self,
            forKeyPath: ObservatingKeyPath,
            options: NSKeyValueObservingOptions.New,
            context: PlayerStatusObservingContext)
    }

    func setupGestures()
    {
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "playNext")
        view.addGestureRecognizer(tapGestureRecognizer)
    }

    func playNext()
    {
        let url = NSBundle.mainBundle().URLForResource(songs[playingIndex], withExtension: nil)
        let playerItem = AVPlayerItem(URL: url!)
        player.replaceCurrentItemWithPlayerItem(playerItem)
        player.play()

        playingIndex = (++playingIndex % 2)
    }

    override func observeValueForKeyPath(keyPath: String?,
        ofObject object: AnyObject?,
        change: [NSObject : AnyObject]?,
        context: UnsafeMutablePointer<Void>)
    {
        if context == PlayerStatusObservingContext
        {

            if let change = change as? [String: Int]
            {
                let newChange = change[NSKeyValueChangeNewKey]!
                switch newChange
                {
                    case AVPlayerItemStatus.ReadyToPlay.rawValue:
                        print("Ready to play")
                    case AVPlayerItemStatus.Unknown.rawValue:
                        print("Unknown")
                    default:
                        print("Other status")
                }

            }

            return
        }
        super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
    }
}

音频播放得很好,非常感谢。我错过了一点。现在在您的帮助下,完成了。您能解释一下什么是
ObservatingKeyPath
nskeypalueobservingoptions。新的
。初始的
Unknown
Ready to play