Если вы используете вариант addObserver на основе замыканий , токен будет наблюдателем , Центр уведомлений вообще ничего не знает о self
в этой ситуации. Документация не очень ясна по этому поводу.
из Twitter
То есть бессмысленно делать: NotificationCenter.default.removeObserver(self)
документы рекомендуют два способа:
Обычный способ
Подписаться как обычно:
let center = NSNotificationCenter.defaultCenter()
let mainQueue = NSOperationQueue.mainQueue()
self.localeChangeObserver = center.addObserverForName(NSCurrentLocaleDidChangeNotification, object: nil, queue: mainQueue) { (note) in
print("The user's locale changed to: \(NSLocale.currentLocale().localeIdentifier)")
}
Удалить наблюдателя в какой-то момент кода. NotificationCenter.default.removeObserver(self.localeChangeObserver)
например, через функцию или в deinit
Одиночная подписка
Удалите наблюдателя сразу после того, как он впервые получит обратный вызов
let center = NSNotificationCenter.defaultCenter()
let mainQueue = NSOperationQueue.mainQueue()
var token: NSObjectProtocol?
token = center.addObserverForName("OneTimeNotification", object: nil, queue: mainQueue) { (note) in
print("Received the notification!")
center.removeObserver(token!)
}
Если вы используете add на основе селектора, self
будет наблюдателем. Следовательно, вы можете сделать:
NotificationCenter.default.removeObserver(self)
Но рекомендуется делать это только внутри deinit
, потому что ваш код может быть не единственным кодом, добавляющим наблюдателей, которые включают объект.