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];
}

144voto

EmptyStack Points 32089

Solution 1 : La première chose à faire est de vérifier si la notification elle-même est affichée deux fois.

Solution 2 : Même si la notification n'est affichée qu'une seule fois, la action sera appelé autant de fois que vous avez ajouté l'observateur pour la notification (peu importe que la notification soit identique ou non). Par exemple, les deux lignes suivantes enregistreront l'observateur( self ) pour la même notification ( aSelector ) deux fois.

[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];

Vous devez trouver l'endroit où vous ajoutez l'observateur pour la deuxième fois, et le supprimer. Et assurez-vous également que le code où vous ajoutez l'observateur n'est pas appelé deux fois.

Solution 3 : Si vous n'êtes pas sûr d'avoir déjà ajouté l'observateur ou non, vous pouvez simplement procéder comme suit. Cela permettra de s'assurer que l'observateur n'est ajouté qu'une seule fois.

[[NSNotificationCenter defaultCenter] removeObserver:self name:aName object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];

17voto

tfrank377 Points 75

Si votre addObserver est exécutée plusieurs fois, elle créera plusieurs observateurs. Mon problème est que j'ai en quelque sorte placé mon observateur dans viewWillAppear qui est apparu plusieurs fois avant que je ne poste la notification et qui a fait que mon observateur a été appelé plusieurs fois.

Bien que la troisième solution d'EmptyStack fonctionne, il y a une raison pour laquelle votre observateur est appelé deux fois, donc en la trouvant, vous pouvez éviter des lignes de code inutiles au lieu de supprimer et ajouter le même observateur.

Je suggère de mettre votre observateur dans viewDidLoad pour éviter des erreurs simples comme celle que j'ai vécue.

6voto

bhadresh Points 465

Essayez de retirer l'observateur dans la méthode viewWillDisappear :

-(void)viewWillDisappear:(BOOL)animated{

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"startAnimating" object:nil]; }

2voto

stcui Points 35

Essayez de mettre un point d'arrêt sur [[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil]; et vérifier si elle est appelée plus d'une fois.

2voto

Joyson Points 2050

Pour ceux qui recherchent une solution dans Swift 2.2 et plus et qui ont atteint cette question comme moi, vous pouvez créer une extension comme suit :

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

Vous pouvez appeler cette méthode comme suit :

NSNotificationCenter.defaultCenter().setObserver(self, selector: #selector(methodName), name: "name", object: nil)

L'extension s'occupera de la suppression de l'observateur précédent s'il existe. Même s'il n'y avait pas d'observateur précédent, ce code ne se plantera pas.

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