继承NSMutableDictionary有点烦人,因为NSDictionary及其相关类是类族(class clusters)。虽然这是可行的,如果您必须将对象本身传递给另一组类,则可能需要这样做。否则,创建一个具有相同基本API并在内部使用NSMutableDictionary对象进行存储的组合类可能更容易。CocoaWithLove.com上有一篇相当不错的文章,介绍了如何实现Ordered Dictionary Subclassing。
但是,这并不能完全解决您的问题。我建议您从上面提到的子类或装饰器类开始,然后显式添加支持-(NSArray*)allKeys
,这是NSDictionary本身的标准访问器。然后,您可以添加支持传递所有键(allKeys)的更改消息,从而使其成为可观察的。
这可以通过在-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语句,并使所有键在设置或删除时通知,如下所示:
- (void)setObject:(id)anObject forKey:(id)aKey
{
[self willChangeValueForKey: @"allKeys"];
[dictionary setObject:anObject forKey:aKey];
[self didChangeValueForKey: @"allKeys"];
}
然后,在您的代码中,您为此对象的键“allKeys”放置了一个单个观察者,您将在每次更改项目时接收通知。
@"@count"
,会发生什么? - Lily Ballard