“addObserver:”和“didChangeValueForKey:”服务于同一目的吗?

时间:2012-04-08 19:03:17

标签: objective-c cocoa key-value-observing

我对Objective-C中的KVO感到有点困惑。如果我的属性符合KVO,我是否有两个选择来发出通知:1。addObserver:.../observeValueForKeyPath:...和2. did/willChangeValueForKey...,还是应该在特定上下文中使用方法did/willChangeValueForKey

我注意到第二个(did...)可以用来将一些更改分组到一个通知中;关于这两种方式还有其他重要的事情要理解吗?第一种方法(addObserver:...)是否无法在某些上下文中使用(尽管上下文符合KVO)?

编辑: 在NSManagedObject的子类中,只使用了did/willChangeValueForKey...,但没有使用addObserver:.../observeValueForKeyPath:...:你知道为什么吗?

1 个答案:

答案 0 :(得分:3)

这两对用于双方对KVO的互动;它们根本不可互换。

addObserver:forKeyPath:options:context:observeValueForKeyPath:ofObject:change:context:客户端使用,即想要进行观察的人。

observeValueForKeyPath:ofObject:change:context:本质上是一个回调;当observ ed (“provider”)对象使用另一组方法(各种did / will {{1}时,它将由内部KVO机制发送})。该通知实际上是通过changeValueFor...方法在那时进行的。