64 votes

Comment empêcher l'observateur dans NSNotification d'être appelé deux fois ?

J'ai un observateur de NSNotification qui est appelé deux fois. Je ne sais pas quoi en faire.

J'ai fait une recherche sur Google mais je n'ai pas trouvé de solution.

[[NSNotificationCenter defaultCenter] addObserver:self
     selector:@selector(connectedToServer:) name:@"ConnectedToServer" object:nil];

- (void)connectedToServer:(NSNotification*)notification {

    [[NSNotificationCenter defaultCenter] postNotificationName:@"SendMessageToServer" object:message];
}

0voto

Vladimír Slavík Points 164

J'avais deux instances de la même classe et il m'a fallu un certain temps avant de réaliser que la notification n'est pas exécutée deux fois dans une instance de cette classe mais deux fois dans deux instances.

0voto

green_knight Points 53

J'utilise des notifications dans une application basée sur des documents. La classe de l'observateur de chaque document (un ViewController) reçoit la notification. Deux documents ouverts, la fonction est appelée deux fois. Trois documents ouverts... vous voyez le genre.

Pour limiter le nombre de destinataires de la notification, vous pouvez spécifier que vous êtes intéressé par un objet particulier, mais cela comporte une particularité : l'objet doit être la même instance d'un objet de classe ; vous ne pouvez pas simplement comparer une valeur ; ainsi, l'UUID n'est pas mis en correspondance, mais une instance de

class DocumentID {
    var id = UUID()
}

fonctionne bien. Injectez ceci à partir de votre document dans chaque classe qui envoie ou reçoit des notifications, et vous avez limité les notifications à votre document.

0voto

Michael Points 389

La solution Swift 5+

NotificationCenter.default.removeObserver(self, name: aName, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(aSelector), name: aName, object: nil)

Quelques conseils (et un couple signifie TOUJOURS 2) :

  1. La méthode du sélecteur doit être exposée à @objc pour fonctionner, donc selon notre exemple :

    @objc func aSelector() { //do work here }
  2. J'ai mis les notifications dans le init() y deinit() et utiliser des singletons pour éviter de les répéter, comme ceci :

    init() {
        NotificationCenter.default.addObserver(self, selector: #selector(aSelector), name: aName, object: nil)
        //add any other notifications here
    }
    
    deinit() {
        NotificationCenter.default.removeObserver(self)
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X