web-dev-qa-db-fra.com

Comment arrêter l'Observer dans NSNotification à appelé deux fois?

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

Je l'ai googlé mais aucune solution n'a été trouvée.

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

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

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

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

Solution 2: Même si la notification n'est publiée qu'une seule fois, l'action sera appelée autant de fois que vous aurez ajouté le observateur de la notification (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 où vous ajoutez l'observateur pour la deuxième fois et le supprimer. Et assurez-vous également que le code auquel 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 faire ce qui suit. Cela garantira 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];
124
EmptyStack

Si votre méthode addObserver est exécutée plusieurs fois, elle créera plusieurs observateurs. Mon problème était que j'avais en quelque sorte placé mon observateur dans viewWillAppear qui apparaissait plusieurs fois avant de publier la notification et il en résultait que mon observateur était appelé plusieurs fois.

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

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

15
tfrank377

Essayez de supprimerObserver dans la méthode viewWillDisappear:

-(void)viewWillDisappear:(BOOL)animated{

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

Essayez de définir un point d'arrêt sur [[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil]; et vérifiez s'il est appelé plusieurs fois.

2
stcui

Pour ceux qui recherchent une solution dans Swift 2.2 et supérieur 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 gérera la suppression de l'observateur précédent s'il existe. Même s'il n'y avait aucun observateur précédent présent, ce code ne plantera pas.

2
Joyson

J'ai eu deux instances de la même classe et il m'a fallu un certain temps avant de réaliser que la notification ne s'exécute pas deux fois dans une instance de cette classe mais deux fois dans deux instances.

0