Frage

Dies ist keine Frage so viel als eine Warnung an andere sie einige Zeit zu speichern.

NSNotificationCenter auf iOS 3 / iPhone OS 3 (Ich gehe davon aus auch Mac OS X und iOS 4) hat das folgende Verhalten:

Wenn Sie sich registrieren, sich mehrmals für die genaue spezifische Meldung, wird NSNotificationCenter nicht erkennen die Redundanz und stattdessen so viele Meldungen an Sie abfeuern, wie Sie eine Beobachtung für sich registriert haben.

Das ist so gut wie nie das Verhalten, das Sie sehen wollen, und ist fast immer zufällig.

Beispiel:

Ich mag meine View-Controller-Benachrichtigungen von einem Singleton Netzobjekt erhalten, wenn neue Daten kommen in:

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

, aber früher habe ich bereits die gleiche Sache in viewWillAppear setzen:

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

Beachten Sie, dass es genau die gleiche Mitteilung, die Lösung auf die gleichen Beobachter, Absender und Benachrichtigung Namen.

In diesem Fall, wenn ich eine dieser nicht addObserver Anrufe entfernen, werde ich doppelte Benachrichtigungen an meinem View-Controller erhalten.

In einer Multithread-Umgebung ist dies eine Welt des Schmerzes. Vertrauen Sie mir.

Genau dies im Fall draußen setzt es andere gibt, die so etwas laufen in.

War es hilfreich?

Lösung

NSNotificationCenter auf iOS 3 / iPhone OS 3 (Ich gehe davon aus auch Mac OS X und iOS 4) hat das folgende Verhalten:

Wenn Sie sich registrieren, sich mehrmals für die genaue spezifische Meldung, wird NSNotificationCenter nicht erkennen die Redundanz und stattdessen so viele Meldungen an Sie abfeuern, wie Sie eine Beobachtung für sich registriert haben.

Das ist so gut wie nie das Verhalten, das Sie sehen wollen, und ist fast immer zufällig.

Beispiel:

Ich mag meine View-Controller-Benachrichtigungen von einem Singleton Netzobjekt erhalten, wenn neue Daten kommen in:

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

, aber früher habe ich bereits die gleiche Sache in viewWillAppear setzen:

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

Beachten Sie, dass es genau die gleiche Mitteilung, die Lösung auf die gleichen Beobachter, Absender und Benachrichtigung Namen.

In diesem Fall, wenn ich eine dieser nicht addObserver Anrufe entfernen, werde ich doppelte Benachrichtigungen an meinem View-Controller erhalten.

In einer Multithread-Umgebung ist dies eine Welt des Schmerzes. Vertrauen Sie mir.

Genau dies im Fall draußen setzt es andere gibt, die so etwas laufen in.

Andere Tipps

Sie sollten und immer Ihre Beobachter aufzuräumen.
Der einfachste Weg, es zu tun ist: [[NSNotificationCenter defaultCenter] removeObserver: self]
viewDidLoad ist kein guter Ort Beobachter hinzuzufügen, weil diese Funktionen mehrmals aufgerufen werden können, dies geschieht, wenn ViewDidUnload ausgelöst wird. Ein guter Ort, um Ihre addObservers in viewWillAppear zu setzen, und removeObservers in viewWillDisappear.

Wie Sie selbst gesagt, macht NSNotificationCenter keine Überprüfung auf Duplikate, die für einige ärgerlich sein, aber macht Sinn, wenn das gesamte System dahinter concidering.

Die gleiche Logik gilt Ziele auf bestimmte Objekte zu geben, aber es ist oft eine Schlüsselerkennungs auf denen.

Vielen Dank für die Einsicht, und für eine gute, SEO-freundliche Warnung:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top