Podklasy NSMutableDictionary jest nieco denerwujące, ze względu na to, że NSDictionary i jego przyjaciele są klastrami klas. Jest to z pewnością wykonalne, a jeśli musisz przekazać obiekt do innego zestawu klas, możesz to zrobić. W przeciwnym razie łatwiej byłoby utworzyć klasę złożoną, która ma ten sam podstawowy interfejs API i wewnętrznie używa obiektu NSMutableDictionary do przechowywania. Jest całkiem niezłe zapisanie jako CocoaWithLove.com, Ordered Dictionary Subclassing, które idzie w tym kierunku.
Jednak to nie rozwiązuje całkowicie twojego problemu. Sugerowałbym, że zaczynasz od klasy podklasy lub klasy dekoratora, takiej jak ta powyżej, a następnie dodawaj obsługę wyraźnie dla -(NSArray*)allKeys
, która jest standardowym akcesoriem samego siebie w samej NSDictionary
. Następnie możesz dodać obsługę przekazywania komunikatów zmian dla allKeys, co umożliwi obserwację.
Można to zrobić, dodając następujący kod wokół metod -setObject:forKey:
i -removeObjectForKey:
.
- (void)setObject:(id)anObject forKey:(id)aKey
{
BOOL addKey=NO;
if (![dictionary objectForKey: aKey]) {
addKey=YES;
[self willChangeValueForKey: @"allKeys"];
}
[dictionary setObject:anObject forKey:aKey];
if (addKey)
[self didChangeValueForKey: @"allKeys"];
}
- (void)removeObjectForKey:(id)aKey
{
[self willChangeValueForKey: @"allKeys"];
[dictionary removeObjectForKey:aKey];
[self didChangeValueForKey: @"allKeys"];
}
Co jest wykonywana jest tutaj to, że jesteśmy dodanie wyraźnego powiadomienia KVO do klasy, kiedy klucze słownika są zmieniane, aby zaznaczyć zmianę tablicy.
To zajmie dodawanie i usuwanie. Jeśli chcesz, aby zmiany zostały zgłoszone na tej samej podstawie, można usunąć, jeśli sprawozdania, i po prostu AllKeys klasy powiadamia o albo ustawić lub usunąć w następujący sposób:
- (void)setObject:(id)anObject forKey:(id)aKey
{
[self willChangeValueForKey: @"allKeys"];
[dictionary setObject:anObject forKey:aKey];
[self didChangeValueForKey: @"allKeys"];
}
Następnie w kodzie, należy umieścić w jeden obserwator dla klucza @ "allKeys" na tym obiekcie, a będziesz otrzymywać powiadomienia o każdej zmianie przedmiotu.
Co się stanie, jeśli zauważysz klawisz '@" @ count "' w słowniku? –
Nie. Nie działa. Jeśli zastąpię @ "@ count" przez @ "key2", to działa, ale to nie jest jednoznaczne rozwiązanie. –