Donnerstag, April 9, 2020

Wie kann ich den Observer in NSNotification zweimal aufrufen?

Habe ich ein Beobachter der NSNotification die zweimal aufgerufen. Ich weiß nicht, was mit ihm zu tun.

Ich es gegoogelt aber keine Lösung gefunden.

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

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

    [[NSNotificationCenter defaultCenter] postNotificationName:@"SendMessageToServer" object:message];
}
Kommentare dem Thema
Es könnte helfen, um uns ein wenig code zu sehen. Kommentarautor: Totumus Maximus
Bitte Lesen Sie diese Antwort stackoverflow.com/questions/10835000/…, in Bezug auf die „blue box“ Klasse-Instanz im interface builder… Kommentarautor: M Jesse

InformationsquelleAutor der Frage Azhar | 2011-10-13

5 Kommentare

  1. 120

    Lösung 1: Die erste Sache ist, um zu überprüfen, ob die Benachrichtigung selbst ist zweimal geschrieben.

    Lösung 2: Auch wenn die Meldung nur ein mal ausgeschrieben, die Aktion wird genannt, wie viele Male, die Sie Hinzugefügt haben die Beobachter für die Benachrichtigung (egal, die Mitteilung derselben ist oder nicht). Zum Beispiel die beiden folgenden Zeilen wird die Registrierung der Beobachter(self) für die gleiche Meldung(aSelector) zweimal.

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

    Haben Sie, um herauszufinden, wo Sie hinzufügen, Beobachter zum zweiten mal, und entfernen Sie es. Und auch stellen Sie sicher, dass der code dort, wo Sie sind, fügen Sie den Betrachter nicht zweimal aufgerufen.

    Lösung 3: Wenn Sie nicht sicher sind, ob Sie bereits Hinzugefügt haben, den Beobachter zu oder nicht, können Sie einfach Folgendes tun. Dies wird sicherstellen, dass der Beobachter nur einmal Hinzugefügt.

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

    InformationsquelleAutor der Antwort EmptyStack

  2. 13

    Wenn Ihr addObserver Methode mehrmals ausgeführt, es werden mehrere Beobachter. Mein Problem war, dass ich irgendwie legte meine Beobachter in viewWillAppear erschien mehrere Male, bevor ich gepostet die Meldung und es führte zu meiner Beobachter wird mehrfach aufgerufen.

    Während EmptyStack 3. Lösung funktioniert, es gibt einen Grund, Ihre Beobachter wird zweimal aufgerufen, so finden, können Sie verhindern, dass unnötig Zeilen code, anstatt das entfernen und hinzufügen von ein und demselben Betrachter.

    Ich würde vorschlagen, Sie setzen Ihre Beobachter in viewDidLoad zu vermeiden Sie einfache Fehler, wie ich Sie erlebt habe.

    InformationsquelleAutor der Antwort tfrank377

  3. 6

    Versuchen, removeObserver in Methode viewWillDisappear :

    -(void)viewWillDisappear:(BOOL)animated{
    
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"startAnimating" object:nil]; }

    InformationsquelleAutor der Antwort bhadresh

  4. 2

    Versuchen legen Sie einen Haltepunkt auf [[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil]; und prüfen, ob es mehr als einmal aufgerufen.

    InformationsquelleAutor der Antwort stcui

  5. 1

    Für die Suche nach einer Lösung im Swift-2.2 und höher und, die erreicht haben, diese Frage gefällt mir, können Sie eine Erweiterung wie folgt :

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

    Rufen Sie die Methode wie folgt :

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

    Die Erweiterung mit der Entfernung der früheren Beobachter, wenn es vorhanden ist. Auch wenn es davor keine Beobachter vor dieser code wird nicht Abstürzen.

    InformationsquelleAutor der Antwort Joyson

Kostenlose Online-Tests