Следует ли удалять уведомления с помощью removeObserver (self) в iOS? - PullRequest
0 голосов
/ 19 февраля 2020

Следует ли удалять уведомление с помощью self в iOS?

Товарищ по команде зарегистрировал уведомление в viewWillAppear и удалил в viewDidDisappear как,

override func viewWillAppear(_ animated: Bool) {
    NotificationCenter.default.addObserver(self, selector: #selector(onDidReceiveData(_:)), name: .didReceiveData, object: API.shared)
}

override func viewDidDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self)
}

При просмотре я прокомментировал и предложил удалить уведомление с явным именем вместо удаления с self, потому что, я думаю, в будущем могут потребоваться другие уведомления для регистрации в viewWillLoad который не должен быть затронут звонком NotificationCenter.default.removeObserver(self) случайно или ошибкой разработчиков. Мое предложение состояло в том, чтобы удалить наблюдателя с помощью

override func viewDidDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self, name:.didReceiveData, object: nil)
}

Товарищи по команде ответили, что удаление с NotificationCenter.default.removeObserver(self) совершенно нормально, потому что мы не регистрируем другие уведомления на данный момент. Я искал ссылку или руководство, чтобы убедить его, почему важно удалить уведомление, явно используя имя, а не self.

Есть ли какое-либо руководство от Apple относительно наилучшей практики удаления наблюдателей за уведомлением?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Дело в том, что в будущем небезопасно удалять все уведомления в viewWillDisappear. Это не хорошая практика по очевидной причине, но она не задокументирована. После iOS 9 нет необходимости вызывать removeObserver, поскольку iOS не пытается уведомлять об освобожденных объектах. В вашем случае вы хотите слушать, даже если контроллер представления не виден, но присутствует в стеке навигации, который вы должны сделать в deinit

    class ViewController: UIViewController {
    deinit {
     NotificationCenter.default.removeObserver(self, name:.didReceiveData, object: nil)
    }
   }
0 голосов
/ 19 февраля 2020

После iOS 9 нет необходимости удалять наблюдателя, так как iOS удалит наблюдателей из смещенных ViewControllers

...