【发布时间】:2019-02-12 09:10:47
【问题描述】:
我对 Key-Value Observing 方法 addObserver(_:forKeyPath:options:context:) 与其随附的 observeValue(forKeyPath:of:change:context:) 之间的区别感到困惑 与 bind(_:to:withKeyPath:options:) 方法之间的区别。
我知道根据 Apple 的 Cocoa Bindings Programming Topics bind 方法似乎使用了 KVO 的概念,并且:
Cocoa 绑定还使用两个协议——
NSEditor和NSEditorRegistration——这有助于确保在用户界面元素被释放之前,任何待处理的编辑都被丢弃或提交。
但是,我也注意到 KVO(及其姐妹,KVC)是来自 Foundation 的 Notifications 设计模式,而 bind 属于 Foundation 的 Object Runtime 和 AppKit 的 Data Management设计模式。
每当您处理来自NSController 的子类并且您想与CoreData 之类的模型层进行通信时,我似乎看到使用bind。但是,Apple 的 Key-Value Observing Programming Guide 说,
键值观察提供了一种机制,允许对象在其他对象的特定属性发生更改时得到通知。 对于应用程序中模型层和控制器层之间的通信特别有用。
我还在一些在线教程中看到了用于对象间通信的 KVO(这不就是委托的用途吗?)。
bind 和 KVO 似乎都在做同样的事情。
两者有什么区别?
我应该使用哪一个?
任何见解都会非常有帮助。提前致谢!
【问题讨论】:
-
Bindings 是建立在 KVO 之上的,而 KVO 是建立在 KVC 之上的。 KVO 比 Bindings 更通用,但有相似之处是有原因的。
-
绑定(使用默认选项)保证如果为一个对象的值调用 setter,则调用其他绑定对象中其他值的 setter。 KVO 正在观察。一个 setter 被调用,你会收到一个通知。 KVO 到此结束。绑定意味着在该通知之后,将调用第二个(绑定)对象中的第二个 setter 调用。
-
简而言之,KVO 是单向的:当属性更改时,观察者会收到通知。绑定是双向的:属性“绑定”到视图或表示——更改属性会更改视图,更改视图会更新属性。
标签: ios swift macos cocoa cocoa-bindings