Создание подклассов NSMutableDictionary немного раздражает из-за того, что NSDictionary и его друзья являются кластерами классов.Это, безусловно, выполнимо, и если вам нужно передать сам объект другому набору классов, то вы можете сделать именно это.В противном случае может быть проще создать составной класс, который имеет тот же базовый API и использует объект NSMutableDictionary для хранения внутри.Существует довольно хорошая статья, как CocoaWithLove.com, Упорядоченное подклассификация словаря , которая идет на это.
Однако это не полностью решает вашу проблему.Я хотел бы предложить, чтобы вы начали с подкласса или класса декоратора, такого как приведенный выше, а затем явно добавили поддержку для -(NSArray*)allKeys
, который является стандартным средством доступа в самом NSDictionary
.Затем вы можете добавить поддержку для передачи сообщений об изменениях для всех ключей, что сделает его наблюдаемым.
Это можно сделать, добавив следующий код вокруг методов -setObject:forKey:
и -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"];
}
Что здесь делается, так это то, что мы добавляем явное уведомление KVO в класс, когда ключи словаря изменены, чтобы пометить изменение в массиве.,Если вы хотите, чтобы об изменениях уведомляли на той же основе, вы можете удалить операторы if и просто сделать так, чтобы allKeys уведомлял об их установке или удалении, как показано ниже:в одном наблюдателе для ключа @ "allKeys" на этом объекте, и вы будете получать уведомления при каждом изменении элемента.