在Cocoa KVO中,为什么NSMutableArray代理上的更改不会通知观察者?
我正在iOS中实现一个DocumentsManager
类,我想创建一个名为documents
的to-many属性,使其符合KVO标准。 它似乎主要工作,我的KVO访问器和mutator方法被调用。 然而,困扰我的是,在我的实例上调用mutableArrayValueForKey:
返回的NSMutableArray
代理上直接进行的任何更改都不会通知观察者。
所以,这段代码通知我关于插入@"aaa"
而不是@"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!
事实certificate, mutableArrayValueForKey:
并不总是返回通知数组。 只有当观察者已经在观察对象上注册时才会这样做!
因此,交换我的前两行可以解决问题:
[[DocumentsManager instance] addObserver:self forKeyPath:@"documents" options:NSKeyValueObservingOptionNew context:NULL]; NSMutableArray *docsProxy = [[DocumentsManager instance] mutableArrayValueForKey:@"documents"];
如果我们能够阅读这些方法的源代码,不禁想到我们节省了多少时间……