如何避免添加多个NSNotification观察者?

现在,API似乎没有提供一种方法来检测是否已经为特定的NSNotification添加了观察者。 避免添加多个NSNotification观察者,而不是维护一个标志以保持跟踪的最好方法是什么? 有没有人已经创build了一个类别来方便这个?

防止重复观察者被添加的一种方法是在再次添加之前显式调用目标/select器的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 

这里假定你只能为每个目标添加一个唯一的观察者来获取任何通知名称,因为它将删除该通知名称的所有现有观察者。

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) } } 

带有extension NotificationCenter { ... }的Upvoted答案不适用于我,因为我的应用程序每次发布通知时都创build了一个viewController的新实例(这有一个Notification观察者),所以删除了一个新实例的观察者一个viewController显然不工作。 先前有通知观察者的viewController实例被调用。

下面的工作对我来说,因为这是视图消失后,通知观察员立即删除。

 // 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) }