2017-02-26 7 views
1

Ich habe einen Beobachter erstellt, um die "Rate" meines AVPlayers zu verfolgen. Die Beobachterbenachrichtigung wird jedes Mal angezeigt, wenn sich die AVPlayer-Rate wie erwartet ändert. Allerdings, wenn ich versuche, den Beobachter zu entfernen, wenn die Wiedergabe auf dem Punkt endet, der die AVPlayer spielen wird, erhalte ich den folgenden Absturz:removeObserver: forKeyPath: stürzt während KeyPath-Benachrichtigung ab

*** 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.' 

Dies macht keinen Sinn, weil der Beobachter registrierte für mich werden muss, um um den Beobachter zu entfernen. Mit anderen Worten, der Punkt, an dem ich den Beobachter entferne, befindet sich in dem Handler zum Empfangen der Beobachterbenachrichtigung. So ist der Beobachter eindeutig registriert. Hier ist mein entsprechender Code ist es, den Betrachter zu erstellen:

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

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

Dann, wenn das Element, das Oberfläche spielt, wird der folgende Handler-Code nach dem Empfang die Beobachter Benachrichtigung ausgeführt wird:

-(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"]; 

Bei der Ausführung von removeObserver, Der App-Absturz tritt auf. Ich habe auch versucht, einen Nicht-Null-Kontext von & MoviePlayer hinzuzufügen und den Beobachter mit diesem Kontext zu entfernen, aber es stürzt immer noch ab. Ich habe auch versucht, die Entfernung zu verzögern, aber das löst das Problem auch nicht.

Was vermisse ich, um diesen Absturz zu vermeiden?

Antwort

2

Sie haben den Beobachter nicht mit NSNotificationCenter registriert, aber mit dem Objekt moviePlayer.

Versuchen Sie,:

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