【发布时间】:2015-06-23 18:06:54
【问题描述】:
我已经为这样的 AVPlayer 添加了一个观察者
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)
}
【问题讨论】: