在 Cocoa KVO 中,为什么 NSMutableArray 代理上的更改不会通知观察者?

2023-11-27

我正在实施一个DocumentsManageriOS 中的类,我想创建一个名为的多对多属性documents符合 KVO 要求。它似乎大部分工作,并且我的 KVO 访问器和修改器方法被调用。然而,令我困扰的是,直接在NSMutableArray调用返回的代理mutableArrayValueForKey:在我的例子中不会通知观察者。

所以,这段代码通知我插入@"aaa"但不属于@"bbb",尽管它们实际上都插入了可见中docsProxy。这是预期的行为吗?如果是这样的话,使用它的好处是什么?mutableArrayValueForKey: method?

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!

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

因此,交换我的前两行可以解决问题:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Cocoa KVO 中,为什么 NSMutableArray 代理上的更改不会通知观察者? 的相关文章

随机推荐