在普通类中,我有一个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:
;您可能会发现它们比通用的“价值变化”方法更适合您.
所有这一切,我相信你在第一段提到的解决方案,以及Girish问题中的outlined by Peter Hosey,可能是最好的方法.