观察 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 的键值对的主要内容,如果未能解决你的问题,请参考以下文章

如何在 scala 中生成的键值对中添加值

如何存储和查询数十亿的键值对

将新的键值对推送到 json

如何在python中打印字典的键值对

如何从字典列表中向现有键值对添加新的键值对?

BigQuery:将数组中的键值对转换为列