Beobachten von Änderungen an einem veränderbaren Array mit KVO vs. NSNotificationCenter
In meinem Modell habe ich ein array von Objekten, die auch als Ereignisse. Ich würde gerne meine controller mitgeteilt werden, wenn ein neues Objekt Hinzugefügt wird, auf Ereignisse.
Dachte ich, dass ein guter Weg, dies zu tun wäre, verwenden Sie die KVO-Muster, um benachrichtigt zu werden, wenn die Ereignisse (Wechsel zwischen ein neues Objekt Hinzugefügt wird)
//AppDelegate
//events is a NSMutableArray @property/@synthesize etc...
[appDelagate addObserver:self
forKeyPath:@"events"
options:NSKeyValueObservingOptionNew
context:NULL];
Aber die observeValueForKeyPath Methode nicht aufgerufen wird, und ich entdeckte, dass Arrays nicht KVO konform 🙁
Ist eine option, um manuell auslösen, die Methode durch aufrufen willChangeValueForKey für den Schlüsselpfad
//ViewController
[self willChangeValueForKey:@"events"];
[self.events addObject:event];
[self didChangeValueForKey:@"events"];
Aber das fühlt sich schwer, da sollte ich wohl auch verfolgen, die vor und nach dem Status meiner Veranstaltungen array, so dass auf Sie zugegriffen werden kann von der observeValueForKeyPath Methode.
Könnte ein Ansatz sein, zu verwenden eine standard-Palette (statt veränderlich) und erstellen/eine neue Instanz der Ereignisse jedes mal, möchte ich hinzufügen, dass ein neues Objekt, oder ich könnte eine separate Eigenschaft, die Spur hält, wie viele Elemente in das mutable-array (ich wünschte, du könntest beobachten @" - Veranstaltungen.count" ).
Andere Möglichkeit wäre die Verwendung von NSNotificationCenter. Ich habe auch gelesen das einige Antworten legen nahe, dass mit Hilfe von Bausteinen (aber ich habe keine Ahnung, wo Sie beginnen).
Schließlich konnte ich halten Sie eine Instanz meines Controllers in meinem delegieren und senden Sie einfach eine entsprechende Nachricht?
//Delegate
[myController eventsDidChange];
Ist es seltsam zu halten eine Referenz auf einen controller aus einer delegieren?
Ich bin kämpfen, um zu verstehen, wie zu wählen, welche ist der beste Ansatz zu verwenden, so dass jede Beratung auf performance, zukünftigen code-Flexibilität und best practices wird sehr geschätzt!
InformationsquelleAutor der Frage MathewS | 2012-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie keinen direkten öffentlichen Eigenschaften für mutable collections zu vermeiden mutierend ohne Ihr wissen.
NSArray
ist nicht der Schlüssel-Wert-beobachten Sie selbst, sondern Ihre eins-zu-viele Eigenschaft@"events"
ist. Hier ist, wie Sie zu beobachten:Zunächst deklarieren Sie eine öffentliche Eigenschaft für eine unveränderliche collection:
Dann in Ihrer Umsetzung sichern Sie es mit einem mutable ivar:
und überschreiben Sie die get-und Set:
Wenn andere Objekte brauchen, hinzufügen von Ereignissen zu Ihrem Modell erhalten Sie eine veränderliche proxy-Objekt durch den Aufruf
-[Model mutableArrayValueForKey:@"events"]
.Löst KVO-Benachrichtigungen durch das setzen der Eigenschaft mit einer neuen Kollektion jeder Zeit. Für eine bessere Leistung und mehr granulare Kontrolle, Umsetzung der rest der array-Zugriffs.
Siehe auch: Beobachten ein NSMutableArray für einfügen/entfernen.
InformationsquelleAutor der Antwort Ryder Mackay
Pro die Dokumentation über accessor-MethodenSie implementieren sollten:
Dann KVO ausgelöst wird, die Benachrichtigungen, wenn diese aufgerufen werden.
InformationsquelleAutor der Antwort Bryan