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

Schreibe einen Kommentar