0

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

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

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

然后在observeValueForKeyPath:ofObject:change:context:发送通知时实现该方法来做某事。

我已经阅读了Key-Value Observing Documentation并找到了关于它的其他帖子。使用 KVO 与 NSNotificationCenter 观察对可变数组的更改观察 NSMutableArray 以进行插入/删除它们都使用 NSMutableArray 作为示例。NSMutableData 也可以吗?我不明白我必须实施什么。

有人能告诉我我究竟必须在哪个类中实现 NSMutableData 对象的 KVO 工作吗?或者,如果这是不可能的,另一种解决方案?

非常感谢!

4

2 回答 2

4

对 KVO 有一个常见的误解:无法观察其他符合 KVO 的属性的内部状态。

NSData 就是这种情况:从 KVO 的角度来看,对象的数据属性不会改变,改变的是 NSData 的状态。如果 NSMutableData 为其内容公开符合 KVO 的属性,您可以通过观察关键路径(如 @"data.contents")来观察更改,但事实并非如此。

KVO 仅适用于 KVC 兼容的属性,这些属性也被记录为兼容 KVO。大多数 Cocoa 框架类不提供这种保证,并且观察对象及其关键路径是一个错误。

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

于 2013-04-18T08:30:08.430 回答
1

KVO 不会帮助您观察 NSMutableData 的内部变化。在您的示例中,您只观察“数据”属性,并且只有在模型的数据属性发生更改时才会收到有关更改的通知(例如,您分配了另一个 NSData 实例)。

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

于 2013-04-18T08:33:16.937 回答