Cocoa - KVO和索引属性的自动通知

时间:2011-08-28 19:00:49

标签: cocoa macos key-value-observing

如果我已正确阅读文档,则对象可以注册为索引属性的观察者(也称为多对多关系),就像它可以注册为普通标量属性的观察者一样。

我已经实现了索引访问器,我知道它们有效,因为数组控制器使用它们来填充表视图,并且可变代理数组也可以看到它们并使用它们。他们的原型如下:

// Make indexable accessors for data:
- (NSUInteger)countOfData;
- (id)objectInDataAtIndex:(NSUInteger)index;
- (NSArray *)dataAtIndexes:(NSIndexSet *)indexes;
- (void)insertObject:(NSDictionary *)dict inDataAtIndex:(NSUInteger)index;
- (void)insertData:(NSArray *)dataArray atIndexes:(NSIndexSet *)indexes;
- (void)removeObjectFromDataAtIndex:(NSUInteger)index;
- (void)removeDataAtIndexes:(NSIndexSet *)indexes;

我已注册NSDocument以下列方式收听:

[self addObserver:self 
       forKeyPath:@"data" 
          options:(NSKeyValueObservingOptionNew |
                   NSKeyValueObservingOptionOld |
                   NSKeyValueObservingOptionInitial |
                   NSKeyValueObservingOptionPrior)
          context:dataArrayChange];

我实际上从未在文档中看到过这方面的具体示例,但是在下面的页面上(向下)有一个如何手动执行此操作的示例:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-SW3

所以我的问题是:有没有办法自动获取通知,或者我是否必须手动执行此操作,例如文档中的示例?

编辑添加:

首先,一些上下文 - 这是一个非常简单的基于NSDocument的应用程序,其中NSDocument保存数据索引属性(其中每个对象都是字典),数组控制器绑定到数据属性,以及表视图显示数据。我想要通知的原因是我想实现撤销,当通知工作时,一切都很好。

其次,当我通过使用dataProxy = [[self mutableArrayValueForKey:@"data"] retain];方法中的-init调用创建的代理访问数据时,会出现问题。

我在代理上使用的电话是:

[dataProxy addObject: <an object>]

这会按预期调用访问者insertData:atIndexes:,但不会生成通知。

如果我直接打电话,就像这样:

[self insertData: <an object> atIndexes: [NSIndexSet indexSetWithIndex:[data count]]];

按预期工作并生成自动通知。

请注意,上述两种方法都调用相同的访问器,并且可能仍有一些微妙的细节可以逃避我。

最后,为了完整性,阵列控制器调用访问器并生成通知。

1 个答案:

答案 0 :(得分:1)

您无需担心手动管理观察,如果您有索引访问者,则会自动发布KVO通知。

您是否实施了observeValueForKeyPath:ofObject:change:context:以获知被观察资产的变化?这是属性更改时将调用的方法。

相关问题