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를 제거하려고 시도했지만 여전히 충돌합니다. 또한 제거 지연을 시도했지만 문제가 해결되지 않습니다.
이 충돌을 피하기 위해 무엇이 누락 되었습니까?