6

我正在 iOS 中实现一个类,我想创建一个称为KVO 兼容DocumentsManager的一对多属性。documents它似乎主要工作,并且我的 KVO 访问器和修改器方法被调用。然而,困扰我的事情是,直接在NSMutableArray通过调用我的实例返回的代理上进行的任何更改mutableArrayValueForKey:都不会通知观察者。

所以,这段代码通知我关于插入@"aaa"但不是 of 的信息@"bbb",尽管它们实际上都插入了可见的docsProxy. 这是预期的行为吗?如果是这样,使用该mutableArrayValueForKey:方法有什么好处?

NSMutableArray *docsProxy = [[DocumentsManager instance] mutableArrayValueForKey:@"documents"];
[[DocumentsManager instance] addObserver:self forKeyPath:@"documents" options:NSKeyValueObservingOptionNew context:NULL];

[[DocumentsManager instance] insertObject:@"aaa" inDocumentsAtIndex:0]; // OK
[docsProxy insertObject:@"bbb" atIndex:0];                              // no notification!
4

1 回答 1

5

事实证明,mutableArrayValueForKey:它并不总是返回一个通知数组。只有当观察者已经在被观察对象上注册时才会这样做!

所以交换我的前两行解决了这个问题:

[[DocumentsManager instance] addObserver:self forKeyPath:@"documents" options:NSKeyValueObservingOptionNew context:NULL];
NSMutableArray *docsProxy = [[DocumentsManager instance] mutableArrayValueForKey:@"documents"];

不禁想如果我们能阅读这些方法的源代码,我们会节省多少时间……</p>

于 2013-11-12T16:24:30.607 回答