在普通类中,我有一个 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/