В настоящее время API, похоже, не дает возможности определить, был ли наблюдатель уже добавлен для конкретной NSNotification. Какой лучший способ избежать добавления нескольких наблюдателей NSNotification, кроме сохранения флага на вашем конце для отслеживания? Кто-нибудь уже создал категорию, чтобы облегчить это?
Как избежать добавления нескольких наблюдателей NSNotification?
Ответ 1
Один из способов предотвратить добавление дубликатов наблюдателей - это явно вызвать removeObserver для целевого/селектора, прежде чем добавлять его снова. Я думаю, вы можете добавить это как метод категории:
@interface NSNotificationCenter (UniqueNotif)
- (void)addUniqueObserver:(id)observer selector:(SEL)selector name:(NSString *)name object:(id)object {
[[NSNotificationCenter defaultCenter] removeObserver:observer name:name object:object];
[[NSNotificationCenter defaultCenter] addObserver:observer selector:selector name:name object:object];
}
@end
Это предполагает, что вы добавите только одного уникального наблюдателя к каждой цели для любого имени уведомления, поскольку оно удалит любых существующих наблюдателей для этого имени уведомления.
Ответ 2
Swift 3:
import Foundation
extension NotificationCenter {
func setObserver(_ observer: AnyObject, selector: Selector, name: NSNotification.Name, object: AnyObject?) {
NotificationCenter.default.removeObserver(observer, name: name, object: object)
NotificationCenter.default.addObserver(observer, selector: selector, name: name, object: object)
}
}
Swift 2:
import Foundation
extension NSNotificationCenter {
func setObserver(observer: AnyObject, selector: Selector, name: String?, object: AnyObject?) {
NSNotificationCenter.defaultCenter().removeObserver(observer, name: name, object: object)
NSNotificationCenter.defaultCenter().addObserver(observer, selector: selector, name: name, object: object)
}
}
Ответ 3
Ответ с поддержкой extension NotificationCenter { ... }
не работал у меня, так как мое приложение создавало новый экземпляр viewController (у него был наблюдатель уведомлений) каждый раз, когда было отправлено уведомление, поэтому удаление наблюдателя в новом экземпляре viewController явно не работает.
Были вызваны предыдущие экземпляры viewController, у которых были наблюдатели уведомлений.
Ниже я работал у меня, так как это удаляло Notification Observer, как только исчезло представление.
// Notification observer added
override func viewWillAppear(_ animated: Bool) {
NotificationCenter.default.addObserver(self, selector: #selector(self.someFunc(notification:)), name: Notification.Name("myNotification"), object: nil)
}
// Notification observer removed
override func viewWillDisappear(_ animated: Bool) {
NotificationCenter.default.removeObserver(self, name: Notification.Name("myNotification"), object: nil)
}