Добавление Observer в UICollectionViewCell. Получение исключения KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED

Я добавляю наблюдателя в UICollectionViewCell, у которого есть AVPlayer для получения продолжительности воспроизводимого элемента.

addObserver(self, forKeyPath: #keyPath(player.currentItem.duration), options: [.new, .initial], context: &playerViewControllerKVOContext)

Удаление наблюдателя в методе deinit.

removeObserver(self, forKeyPath: #keyPath(player.currentItem.duration), context: &playerViewControllerKVOContext)

Получение исключения случайным образом

KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED

Кто-нибудь сталкивался с подобной проблемой?


person Ritu    schedule 10.01.2019    source источник
comment
В каком методе вы добавляете наблюдателя?   -  person Midhun MP    schedule 10.01.2019
comment
У меня есть собственный метод для configurePlayer(), когда экземпляр игрока готов, после этого я добавляю наблюдателя.   -  person Ritu    schedule 10.01.2019
comment
Из какого метода вы вызываете этот configurePlayer? viewDidLoad, viewWillAppear или из метода IBAction?   -  person Midhun MP    schedule 11.01.2019


Ответы (1)


Прежде чем вы сможете добавить своих наблюдателей, убедитесь, что вы удалили добавленных наблюдателей.

Аналогичным образом создайте две функции для добавления и удаления наблюдателей, например

Чтобы добавить наблюдателей

func addObserver() { 
   addObserver(self, forKeyPath: #keyPath(player.currentItem.duration), options: [.new, .initial], context: &playerViewControllerKVOContext)

}

Удаление наблюдателей

func removeObservers() {
     removeObserver(self, forKeyPath: #keyPath(player.currentItem.duration), context: &playerViewControllerKVOContext)

}

Обязательно вызовите removeObserver(), прежде чем вызывать addObserver().

Удачного кодирования!

person Saranjith    schedule 10.01.2019