Добавяне на наблюдател в 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