观察 NSMutableSet 的键值对
Posted
技术标签:
【中文标题】观察 NSMutableSet 的键值对【英文标题】:Key-Value Observing an NSMutableSet 【发布时间】:2011-06-19 16:16:30 【问题描述】:在一个普通的类中,我有一个 NSMutableSet 属性。每当将对象添加到集合中或从集合中删除时,我都想执行一些自定义代码。我知道我可以在课堂上写一些类似addObjectToSet:
的方法,但我想知道在片场是否有更优雅的直接 KVO 解决方案。
事实证明,当您尝试向其添加观察者时,NSSet 会引发异常。毫不奇怪,因为可能没有要观察的命名 keyPath。 The documentation 非常清楚异常,但我不明白建议的解决方法:
不是观察集合,而是观察无序的多对多关系,集合是相关对象的集合。
有人能重申一下这是什么意思吗?那么解决方法会是什么样子?
【问题讨论】:
有一些相关的讨论可以在下面的链接***.com/questions/1610422/kvo-on-an-nscountedset 【参考方案1】:这是一种非常密集的说法:“不要将观察者添加到集合本身,将观察者添加到包含该集合的类”:
[myObjWithASetAsIvar addObserver:self
forKeyPath:@"nameOfIvarHoldingTheSet"
options:NSKeyValueObservingOptionNew
context:nil];
一个棘手的问题是您需要包装对集合的所有访问,以便发送正确的通知。在包含集合的类中:
[self willChangeValueForKey:@"nameOfIvarHoldingTheSet"];
// Do something with the set
[self didChangeValueForKey:@"nameOfIvarHoldingTheSet"];
还有两种专门针对set的通知方式:willChangeValueForKey:withSetMutation:usingObjects:
和didChangeValueForKey:withSetMutation:usingObjects:
;您可能会发现它们比通用的“值更改”方法更适合您。
话虽如此,我相信您在第一段中提到的解决方案以及 Girish 所链接的问题中的 outlined by Peter Hosey 可能是最好的方法。
【讨论】:
太好了,我终于明白了 :) 我已经按照建议编写了自己的访问器列表,并且对 KVO 有了更多的了解。谢谢 Josh 和 Girish!【参考方案2】:来自 Apple 关于 NSSet(以及,通过推断和暗示,NSMutableSet)的文档:
NSSet 对象是不可观察的,所以这个方法会引发异常 在 NSSet 对象上调用时。与其观察集合,不如观察 集合为集合的无序多对多关系 相关对象。
我很高兴您似乎找到了答案,但事实上您的初始方法存在缺陷(因为您假设可以在 NSSet 上使用 addObserver),无论如何都需要提及这一点。
【讨论】:
【参考方案3】:当你把它与一个例子联系起来时,它实际上是很清楚的:
如果你有一个类 Bank 有一个 NSSet 的 Accounts,不要在 Bank.accounts 上添加观察者,在 Account.bank 上添加观察者
【讨论】:
以上是关于观察 NSMutableSet 的键值对的主要内容,如果未能解决你的问题,请参考以下文章