2017-02-26 1 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이 아닌 컨텍스트를 추가하고 해당 컨텍스트로 observer를 제거하려고 시도했지만 여전히 충돌합니다. 또한 제거 지연을 시도했지만 문제가 해결되지 않습니다.

이 충돌을 피하기 위해 무엇이 누락 되었습니까?

답변

2

관찰자를 NSNotificationCenter에 등록하지 않았지만 moviePlayer 개체가 있습니다.

시도의 행함 :

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