objective-c - 观察 NSMutableSet 的键值对

标签 objective-c key-value-observing nsmutableset

在普通类中,我有一个 NSMutableSet 属性。每当将对象添加到集合或从集合中删除对象时,我都想执行一些自定义代码。我知道我可以为该类编写一些类似 addObjectToSet: 的方法,但我想知道是否有一个更优雅的解决方案,在集合上直接使用 KVO。

事实证明,当您尝试向其添加观察者时,NSSet 会引发异常。不足为奇,因为可能没有要观察的命名 keyPath。 The documentation非常清楚异常,但我不明白建议的解决方法:

Instead of observing a set, observe the unordered to-many relationship for which the set is the collection of related objects.

有人能重申一下这是什么意思吗?那么解决方法会是什么样子?

最佳答案

这是一种非常密集的说法“不要将观察者添加到集合本身,而是将观察者添加到包含集合的类”:

[myObjWithASetAsIvar addObserver:self
                      forKeyPath:@"nameOfIvarHoldingTheSet"
                         options:NSKeyValueObservingOptionNew
                         context:nil];

一个棘手的问题是您需要包装对集合的所有访问,以便发送正确的通知。在包含集合的类中:

[self willChangeValueForKey:@"nameOfIvarHoldingTheSet"];
// Do something with the set
[self didChangeValueForKey:@"nameOfIvarHoldingTheSet"];

还有两种专门针对集合的通知方式:willChangeValueForKey:withSetMutation:usingObjects:didChangeValueForKey:withSetMutation:usingObjects: ;您可能会发现它们比通用的“值(value)改变”方法更适合您。

综上所述,我相信您在第一段中提到的解决方案,以及outlined by Peter Hosey在 Girish 链接到的问题中,可能是最好的方法。

关于objective-c - 观察 NSMutableSet 的键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6403570/

相关文章:

iphone - 使用唯一的图像和文本配置 UITableViewCell 对象

objective-c - 禁用 GL_DEPTH_TEST 时,纹理消失

ios - 为什么 NSMutableSet 不删除其中包含的对象?

objective-c - DEBUG宏在哪里定义的?

objective-c - NSNotification的测试类型

objective-c - 通过 KVO 观察对象的变化,上下文指针似乎不适用于 void*,但适用于 NSString*

ios - 提醒 ViewController 服务层发生变化的 Swift 规范是什么?

cocoa - 您知道网上有任何键值编码和键值观察 session 视频吗?

iphone - 在 NSMutableSet 中查找具有相同属性值的对象

ios - 为什么NSMutableSet可以添加的对象多于容量