ios - 使用 NSMutableData iOS 进行键值观察

标签 ios xcode key-value-observing nsmutabledata

在我的模型中,我有一个名为数据的 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 吗?或者,如果这不可能,另一种解决方案?

非常感谢!

最佳答案

对于 KVO 存在一个常见的误解:不可能观察到符合 KVO 的属性的内部状态。

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

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

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

关于ios - 使用 NSMutableData iOS 进行键值观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16077482/

相关文章:

ios - UIApplicationStateActive 时如何处理通知

javascript - SAPUI5变更检测机制

ios - APPLE 登录 - 删除帐户

ios - 如果从另一个类调用 removeFromSuperview 则不起作用

ios - 将 ruby​​ 脚本添加到 podsec 文件

iphone - 数组中的 NSNumber

ios - NSManagedObject 时间戳更新

ios - Swift KVO 持有对象引用计数

ios - 向 Openhab2 和 Swift 发布 API 请求

c++ - 恐惧引起的泄漏