2011-06-19 13 views
7

W klasie prostej mam właściwość NSMutableSet. Gdy obiekty są dodawane lub usuwane z zestawu, chcę wykonać niestandardowy kod. Wiem, że mogłem napisać kilka klas do metod, ale zastanawiałem się, czy istnieje bardziej eleganckie rozwiązanie z bezpośrednim KVO na planie.Wartość kluczowa Obserwacja obiektu NSMutableSet

Okazuje się, że NSSet zgłosi wyjątek podczas próby dodania do niego obserwatora. Nic dziwnego, ponieważ prawdopodobnie nie ma nazwanej ścieżki keyPath do obserwacji. The documentation jest całkiem jasne, o wyjątku, ale nie rozumiem sugerowane rozwiązania:

Zamiast obserwując zestaw, obserwować nieuporządkowaną relacji do wielu, dla których zestaw to zbiór powiązanych ze sobą obiektów.

Czy ktoś mógłby powtórzyć, co to oznacza? A jak obejdzie takie obejście?

+1

Istnieje kilka powiązanych dyskusji można znaleźć pod następującym linkiem http://stackoverflow.com/questions/1610422/kvo-on-an-scountedset –

Odpowiedz

6

To dość gęsty sposób na powiedzenie „nie dodawaj obserwatora do samego zestawu, dodać obserwatora do klasy, która zawiera zestaw”:

[myObjWithASetAsIvar addObserver:self 
         forKeyPath:@"nameOfIvarHoldingTheSet" 
         options:NSKeyValueObservingOptionNew 
         context:nil]; 

Ten skomplikowany bit jest, że trzeba aby zawinąć wszystkie swoje wizyty w zestawie, aby można było wysłać odpowiednie powiadomienia. W klasie zawierającej zestaw:

[self willChangeValueForKey:@"nameOfIvarHoldingTheSet"]; 
// Do something with the set 
[self didChangeValueForKey:@"nameOfIvarHoldingTheSet"]; 

Istnieją również dwie metody powiadamiania specjalnie dla zestawów: willChangeValueForKey:withSetMutation:usingObjects: i didChangeValueForKey:withSetMutation:usingObjects:; może się okazać, że działają one lepiej niż ogólne metody "zmiany wartości".

Wszystko to powiedziawszy, uważam, że rozwiązanie, o którym wspomniałeś w swoim pierwszym akapicie, i outlined by Peter Hosey w pytaniu Girish, które jest powiązane z, jest prawdopodobnie najlepszą drogą.

+0

Świetnie, że w końcu rozumiem :) Poszedłem i napisałem moimi własnymi dostępnymi do listy, zgodnie z sugestią, i wiem jeszcze trochę więcej o KVO. Dzięki Josh & Girish! – epologee

1

Z dokumentacji Apple na NSSet (i, wnioskowania i implikacji, NSMutableSet):

NSSet obiekty nie są obserwowalne, więc ta metoda zgłasza wyjątek gdy wywołana na obiekcie NSSet. Zamiast obserwować zbiór, obserwuj nieuporządkowaną relację do-many, dla której zbiór jest zbiorem powiązanych obiektów.

Cieszę się, że wydaje się, że znalazłem odpowiedź, ale fakt, że początkowe podejście było wadliwe (w które zakłada można użyć addObserver na NSSet), to musiały być wymienione, niezależnie.

0

To rzeczywiście dość oczywiste, gdy odnoszą się do przykładu:

Jeśli bank klasy, która ma NSSet rachunków nie sumują obserwatora na Bank.accounts dodaj obserwatora na koncie. bank

Powiązane problemy