在我的模型中,我有一个名为data的NSMutableData对象。我想从另一个对象观察它,并在添加或删除数据时收到通知。
我知道这是一个多对多的关系,所以我不能通过首先添加带有此代码的观察者来使用普通的KVO
[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也可以吗?我不明白我必须实施什么。
有人可以告诉我,我必须在哪个类中实现什么才能让NSMutableData对象的KVO工作?或者,如果这是不可能的,另一种解决方案?
非常感谢!
答案 0 :(得分:4)
KVO存在一个常见的误解:不可能观察到符合KVO标准的财产的内部状态。
NSData就是这种情况:从KVO的角度来看,对象的数据属性不会改变,而是NSData的状态会发生变化。如果NSMutableData为其内容公开符合KVO的属性,您可以通过观察关键路径(如@“data.contents”)来观察更改,但事实并非如此。
KVO仅适用于符合KVC标准且符合KVO标准的属性。大多数Cocoa框架类都不提供这种保证,观察对象及其关键路径是一个错误。
针对您的案例的解决方案不是将NSMutableData
公开为公共属性,而是使用不可变数据并将appendData:
等方法添加到自定义类中。这将使您有机会对这些方法中的数据对象进行更改并手动发出KVO通知(使用willChangeValueForKey:@"data"
...执行更改... didChangeValueForKey:@"data"
)。
答案 1 :(得分:1)
KVO无法帮助您观察NSMutableData的内部更改。在您的示例中,您只观察“数据”属性,并且只有在您的模型的数据属性发生更改时才会收到有关更改的通知(例如,您指定了另一个NSData实例)。
在您的情况下,我建议您使用通知: 对数据突变感兴趣的Object订阅给定名称的通知,每次将新数据附加到Model的数据时,Model都会发布此通知。