W moim modelu mam tablicę obiektów zwanych zdarzeniami. Chciałbym, aby mój kontroler był powiadamiany o każdym dodaniu nowego obiektu do wydarzeń.Obserwowanie zmian w tablicy zmiennych przy użyciu KVO vs. NSNotificationCenter
Myślałem, że to dobry sposób, aby zrobić to byłoby użyć deseniu KVO, aby otrzymywać powiadomienia, gdy wydarzenia zmiany (z nowego obiektu dodawanych)
// AppDelegate
// events is a NSMutableArray @property/@synthesize etc...
[appDelagate addObserver:self
forKeyPath:@"events"
options:NSKeyValueObservingOptionNew
context:NULL];
Ale metoda observeValueForKeyPath nie było miano i odkryłem, że tablice nie są zgodne KVO :-(
Jedną z opcji jest ręcznie wywołać metodę wywołując willChangeValueForKey dla keypath
// ViewController
[self willChangeValueForKey:@"events"];
[self.events addObject:event];
[self didChangeValueForKey:@"events"];
Ale to czuje się ciężki ponieważ mam prawdopodobnie również śledzić stan przed i po mojej tablicy zdarzeń tak, że może on być dostępny z metodą observeValueForKeyPath.
Jednym ze sposobów może być użycie standardowej tablicy (zamiast zmiennego) i utworzenie/ustawienie nowej instancji zdarzeń za każdym razem, gdy chcę dodać nowy obiekt, lub mogę utworzyć oddzielną właściwość, która śledzi liczbę elementy są w tablicy zmiennych (chciałbym, abyś mógł zaobserwować @ "events.count").
Inną opcją byłoby użycie NSNotificationCenter. Przeczytałem również kilka odpowiedzi, które sugerują użycie bloków (ale nie mam pojęcia, od czego zacząć).
W końcu, czy mogę zachować instancję kontrolera u mojego delegata i po prostu wysłać odpowiednią wiadomość?
// Delegate
[myController eventsDidChange];
Czy posiadanie odniesienia do kontrolera przez delegata jest dziwne?
Staram się zrozumieć, jak wybrać najlepsze podejście do użytkowania, więc wszelkie porady dotyczące wydajności, przyszłej elastyczności kodu i najlepszych praktyk są mile widziane!
Dziękujemy! mutableArrayValueForKey wykonuje lewę. Czy masz jakieś wskazówki, jak wybrać wzór do użycia (KVO, NotificationCenter, delegata), kiedy chcesz komunikować się między modelem a kontrolerem? – MathewS
Na pewno czegoś tutaj brakuje. Czy ktoś mógłby wyjaśnić, gdzie setEvents zostałoby wywołane, gdyby ktoś dodał lub insertObject: atIndex: obiekt do tablicy tablicy zmiennej? –