Comment éviter d'append plusieurs observateur NSNotification?

À l'heure actuelle, l'API ne semble pas permettre de détecter si un observateur a déjà été ajouté pour une NSNotification particulière. Quelle est la meilleure façon d'éviter d'append plusieurs observateurs NSNotification autres que le maintien d'un drapeau de votre côté pour garder une trace? Est-ce que quelqu'un a déjà créé une catégorie pour faciliter cela?

Une façon d'empêcher l'ajout d'observateurs en double consiste à appeler explicitement removeObserver pour la cible / le sélecteur avant de l'append à nouveau. J'imagine que vous pouvez append ceci comme une méthode de catégorie:

@interface NSNotificationCenter (UniqueNotif) - (void)addUniqueObserver:(id)observer selector:(SEL)selector name:(NSSsortingng *)name object:(id)object { [[NSNotificationCenter defaultCenter] removeObserver:observer name:name object:object]; [[NSNotificationCenter defaultCenter] addObserver:observer selector:selector name:name object:object]; } @end 

Cela suppose que vous appendez un seul observateur unique à chaque cible pour tout nom de notification, car il supprimera tous les observateurs existants pour ce nom de notification.

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: Ssortingng?, object: AnyObject?) { NSNotificationCenter.defaultCenter().removeObserver(observer, name: name, object: object) NSNotificationCenter.defaultCenter().addObserver(observer, selector: selector, name: name, object: object) } } 

La réponse Upvoted avec extension NotificationCenter { ... } ne fonctionnait pas pour moi, car mon application créait une nouvelle instance d'un viewController (avec un observateur de notification) chaque fois qu'une notification était publiée, supprimant ainsi un observateur sur une nouvelle instance d'un viewController ne fonctionne évidemment pas. Les instances précédentes du viewController qui avaient des observateurs de notification étaient appelées.

Le ci-dessous a fonctionné pour moi, puisque cela enlevait l'observateur de notification dès que la vue disparaissait.

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