2015-10-20 4 views
1

У меня ошибка NSInternalInconsistencyException, когда я пытаюсь передать песню из url с помощью AVPlayer. Я создаю глобальный потоковый проигрыватель в структуре, чтобы мой потоковый проигрыватель мог использовать глобально.Как исправить исключение NSInternalInconsistencyException?

вот мой код, чтобы играть новую песню:

User.songPlayer = AVPlayer(URL: NSURL(string: User.streamSongUrl!)!) 
NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: User.songPlayer?.currentItem) 
User.songPlayer?.addObserver(self, forKeyPath: "status", options: [], context: nil) 

slidetimer = NSTimer.scheduledTimerWithTimeInterval(0.0, target: self, selector: "updateSlider", userInfo: nil, repeats: true) 
progressBar.hidden = true 
progressTimerLabel.text = "PREVIEW" 
progressMinTimeLabel.hidden = true 

и вот лог ошибок:

2015-10-20 10: 00: 41,453 joove [6466: 141737] *** Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Экземпляр 0x7f88138c2490 класса AVPlayer был освобожден, а наблюдатели с ключевыми значениями все еще были зарегистрированы с ним. Информация о текущем наблюдения: ( Контекст: 0x0, свойство: 0x7f8815e6ca70> )»

Как я могу исправить это? Дайте мне какие-либо предложения obj-c или swift

+0

Ну, сообщение об ошибке довольно ясно, и вы очень хорошо сосредоточились на коде. Вы добавляете наблюдателя KVO к 'User.songPlayer', но позже' User.songPlayer' выходит из существования, по-видимому, потому, что «Пользователь» выходит из существования, без вашего удаления наблюдателя. Вы не должны этого допустить. – matt

ответ

0

Ошибка ясно. Вы добавили наблюдателя в AVPlayer, но вы не удаляете наблюдателя до освобождения AVPlayer.

Обновите свой код, чтобы позвонить removeObserver на номер User.songPlayer, прежде чем игрок освободится.

+0

Я не знаю, когда именно User.songPlayer освободится, можете ли вы дать мне более четкое объяснение? –

+0

Вы не предоставили достаточно информации для этого. Возможно, вам нужно добавить функцию 'deinit' для вашего класса' User'. Или вы должны удалить 'self' в качестве наблюдателя, когда« self »делается с игроком. – rmaddy

+0

Пользователь является структурой, так что я не могу добавить deinit на пользователя. Я попытался добавить 'User.songPlayer? .removeObserver (self, forKeyPath:« status », context: nil)' before' User.songPlayer = AVPlayer (URL: NSURL (строка: User.streamSongUrl!)!) 'И я получил * * 2015-10-20 10: 53: 46.646 joove [8869: 181039] *** Завершение приложения из-за неотображенного исключения «NSRangeException», причина: «Не удается удалить наблюдателя для ключевого пути« статус », из , потому что он не зарегистрирован как наблюдатель. '** –

0

Одна из распространенных причин NSInternalInconsistencyException - не отменять регистрацию с KVO, что приводит к нежелательному сбою, поскольку обратный вызов приходит к уже выпущенному объекту.

Пожалуйста, убедитесь, что вы удалили своего наблюдателя из всех уведомлений при освобождении. Что-то вроде этого:

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
    User.songPlayer.removeObserver(self, forKeyPath: "status") 
} 
+0

Это не проблема. Это наблюдатель на «AVPlayer», а не на «NSNotificationCenter», который вызывает этот крах. Хотя код в этом ответе также должен быть добавлен. – rmaddy

+0

Да, вы правы @rmaddy. В спешке я пропустил эту линию. Исправил мой код сейчас. Спасибо! – Abhinav

+0

Этого еще недостаточно. Это все еще не касается того, что 'User.songPlayer' освобождается до того, как' self' делает, что является проблемой в вопросе. – rmaddy

Смежные вопросы