2013-04-18 34 views
0

在我的模型中,我有一个名为data的NSMutableData对象。我想从另一个对象观察它,并在添加或删除数据时收到通知。使用NSMutableData进行键值观察iOS

我明白,这是一个一对多的关系,所以我不能先使用此代码添加观察者使用正常志愿

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

,然后实现observeValueForKeyPath:ofObject:change:context:方法时,做一些事情通知发送。

我已阅读Key-Value Observing Documentation,我发现有关它的其他帖子。 Observing Changes to a mutable array using KVO vs. NSNotificationCenter & Observing an NSMutableArray for insertion/removal它们都使用NSMutableArray作为示例。 NSMutableData也有可能吗?我不明白我必须执行什么。

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

非常感谢!

回答

4

KVO存在一个常见的误解:无法观察KVO兼容属性的内部状态。

这就是NSData的情况:从KVO的角度来看,对象的数据属性不会改变,它的状态是NSData的状态发生了变化。如果NSMutableData将为其内容展示KVO兼容属性,则可以通过观察关键路径(如@“data.contents”)来观察更改,但事实并非如此。

KVO仅适用于符合KVO标准的属性,这些属性也被记录为符合KVO标准。大多数Cocoa框架类没有提供这种保证,它是观察对象及其关键路径的缺陷。

针对您的案例的解决方案不是将NSMutableData作为公共属性公开,而是使用不可变数据并将类似appendData:的方法添加到您的自定义类中。这将使您有机会对这些方法中的数据对象进行更改并手动发出KVO通知(使用willChangeValueForKey:@"data" ...执行更改... didChangeValueForKey:@"data")。

+0

谢谢你的帮助!这对我来说是一个更好的解决方案 –

1

KVO不会帮助您观察NSMutableData的内部更改。在你的例子中,你只观察“data”属性,并且只有当你的Model的data属性被改变时(例如你指定了另一个NSData实例),你才会收到有关更改的通知。

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