用NSMutableData iOS观察键值

在我的模型中,我有NSMutableData对象称为数据。 我想从另一个对象观察它,并在添加或删除数据时收到通知。

我知道这是一个多对多的关系,所以我不能使用普通的KVO,首先添加这个代码的观察者

[object addObserver:self forKeyPath:@"data" options:NSKeyValueObservingOptionNew context:NULL]; 

然后在发送通知时执行observeValueForKeyPath:ofObject:change:context:方法。

我已经阅读了关键价值观察文件,并且发现了其他的文章。 使用KVO与NSNotificationCenter 观察 对可变数组的更改 & 观察NSMutableArray进行插入/删除它们都使用NSMutableArray作为示例。 这也是可能的NSMutableData? 我不明白我必须执行什么。

有人可以告诉我什么我真的必须实现在哪个类获得NSVutableData对象的KVO工作? 或者如果这是不可能的,另一个解决scheme?

非常感谢!

KVO有一个常见的误解:观察KVO兼容的财产的内部状态是不可能的。

NSData就是这样的情况:从KVO的angular度来看,对象的数据属性不会改变,它的状态是NSData的改变。 如果NSMutableData会暴露其内容的KVO兼容属性,则可以通过观察关键path(如@“data.contents”)来观察更改,但事实并非如此。

KVO仅适用于KVC兼容的属性,也被logging为符合KVO的属性。 大多数Cocoa框架类不提供这种保证,观察对象及其关键path是一个错误。

你的情况的一个解决办法是不暴露一个NSMutableData作为一个公共属性,而是使用不可变的数据,并添加像appendData:方法到您的自定义类。 这将使您有机会对这些方法中的数据对象进行更改,并手动发出KVO通知(使用willChangeValueForKey:@"data" …执行更改… didChangeValueForKey:@"data" )。

KVO不会帮助你观察NSMutableData的内部变化。 在你的例子中,你只观察“数据”属性,只有当你的模型的数据属性被改变时(例如,你指定了NSData的另一个实例),你才会得到有关更改的通知。

在你的情况下,我想build议你使用通知:对数据突变感兴趣的对象订阅给定名称的通知,并且模型在每次将新数据附加到模型数据时发布此通知。