Подтвердить что ты не робот

Как избежать добавления нескольких наблюдателей NSNotification?

В настоящее время API, похоже, не дает возможности определить, был ли наблюдатель уже добавлен для конкретной NSNotification. Какой лучший способ избежать добавления нескольких наблюдателей NSNotification, кроме сохранения флага на вашем конце для отслеживания? Кто-нибудь уже создал категорию, чтобы облегчить это?

4b9b3361

Ответ 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)


}