Это хороший вариант использования для переменной-члена с наблюдателем свойства: просто сделайте наблюдателя уведомлений членом вашего подкласса View Controller и выполните очистку наблюдателя уведомлений внутри блока willSet:
class MyViewController: UIViewController {
var notificationObserver: Any? {
willSet {
// if notificationObserver is not null, unregister it
if let observer = notificationObserver {
NotificationCenter.default.removeObserver(observer)
}
}
}
override func viewWillAppear(_ animated: Bool) {
notificationObserver = NotificationCenter.default.addObserver(self,
selector: #selector(handlePushNotification(notification:)),
name: NSNotification.Name(rawValue: "abc"),
object: nil)
}
override func viewWillDisappear(_ animated: Bool) {
notificationObserver = nil
}
}
Это гарантирует, что существующий наблюдатель будет всегда незарегистрированным при создании нового.
Если вы все еще получаете несколько обратных вызовов, это будет означать, что уведомление отправляется большечем один раз.