2017-02-26 6 views
1

AVPlayerの「レート」を追跡するためにオブザーバを作成しました。 AVPlayerのレートが期待どおりに変化するたびに、オブザーバーの通知が提示されます。私は再生がAVPlayerが再生されていることを項目に終了したときにオブザーバを削除しようとすると、しかし、私は、次のクラッシュを取得:removeObserver:forKeyPath:keyPath通知中にクラッシュする

*** Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <MediaController 0x10181e000> for the key path "rate" from <NSNotificationCenter 0x1740da080> because it is not registered as an observer.' 

観察者が私のために登録する必要がありますので、これは意味がありません。観察者を取り除く。言い換えれば、オブザーバーを削除するポイントは、オブザーバー通知を受け取るためのハンドラーにあります。明らかに、オブザーバーは登録されています。ここではオブザーバを作成するために、私の関連するコードです:仕上げを再生している項目は、次のハンドラコードがオブザーバー通知受信時に実行された後

AVPlayerItem *item = [[AVPlayerItem alloc]initWithURL:address]; 
moviePlayer = [[AVPlayer alloc]initWithPlayerItem:item]; 

[moviePlayer addObserver:self 
       forKeyPath:@"rate" 
        options:NSKeyValueObservingOptionNew 
        context:NULL]; 

:removeObserverの実行時

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 

if ([keyPath isEqualToString:@"rate"]) { 
    float rate = [change[NSKeyValueChangeNewKey] floatValue]; 
    if (rate == 0.0) { 
     // Playback stopped 

     if (CMTimeGetSeconds(moviePlayer.currentTime) >= 
      CMTimeGetSeconds(moviePlayer.currentItem.duration)) { 
      // Playback reached end 

      // Remove further notifications until the next time we need the movie player 
      [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:@"rate"]; 

を、アプリのクラッシュが発生します。 & moviePlayerのnull以外のコンテキストを追加しようとしましたが、そのコンテキストでオブザーバーを削除しましたが、それでもクラッシュします。私も削除を遅らせてみましたが、それでも問題は解決しません。

このクラッシュを避けるために私は何が欠けていますか?

答えて

2

あなたはNSNotificationCenterではなく、moviePlayerオブジェクトを使用してオブザーバを登録しました。

はやってみます

// Remove further notifications until the next time we need the movie player 
[moviePlayer removeObserver:self forKeyPath:@"rate"]; 
関連する問題