Крэшится приложение после добавления Observer

avplayer

#1

Всем привет!
Есть вьюха для аудиоплеера который реализую при помощи AVPlayer и проигрываю трэк из сети.
Для вывода длины трэка добавил в метод viewDidload observer:

player?.currentItem?.addObserver(self,
                               forKeyPath: #keyPath(AVPlayerItem.status),
                               options: [.old, .new],
                               context: &playerItemContext)

И реализовал его обработку следующим методом:

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        // Only handle observations for the playerItemContext
        guard context == &playerItemContext else {
            super.observeValue(forKeyPath: keyPath,
                               of: object,
                               change: change,
                               context: context)
            return
        }

        if keyPath == #keyPath(AVPlayerItem.status) {
            let status: AVPlayerItem.Status
            if let statusNumber = change?[.newKey] as? NSNumber {
                status = AVPlayerItem.Status(rawValue: statusNumber.intValue)!
            } else {
                status = .unknown
            }

            // Switch over status value
            switch status {
            case .readyToPlay:
                if let duration = player?.currentItem?.duration {
                    let seconds = CMTimeGetSeconds(duration)

                    let secondsText = Int(seconds) % 60
                    let minutesText = String(format: "%02d", Int(seconds) / 60)
                    totalTimeLabel.text = "\(minutesText):\(secondsText)"
                }
            // Player item is ready to play.
            case .failed: break
            // Player item failed. See error.
            case .unknown: break
                // Player item is not yet ready.
            }
        }
    }

При первой загрузке вьюхи всё окей – в моём лэйбле появляется полная длинна трэка.
Но при уходе с вьюхи плеера (эта вьюха связана навигейшен контроллером с простым tableView со списком трэков) по кнопке назад и повторным открытием вьюхи плеера время уже не отоброжается и приложение крэшится.
Причём крэш может произойти не сразу и в консоль не всегда выдаёт ошибку. Часто там просто (lldb) и всё. А иногда крэшится сразу при первом возврате в список трэков.
Но иногда я могу увидеть хоть какое-то описание ошибки в консоли:

terminating with uncaught exception of type NSException

Подскажите, пожалуйста, куда копать и в чём может быть проблема?
Без обсервера приложение работает стабильно, поэтому грешу именно на него.


#2

И снова самостоятельно смог решить вопрос.
Что бы избавиться от крэшей во вьюху нужно просто добавить деинициализатор:

deinit {
        player?.currentItem?.removeObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), context: &playerItemContext)
}   

p.s. не советую повторять за мной – сам не ведаю, что творю :sweat_smile:


#3

:rofl::rofl::rofl::rofl::laughing::rofl::rofl::rofl:
привет, брат ))


#4

всё правильно делаете: не нужны наблюдатели если контроллер выгружается из памяти )