键值观察 (KVO) vs. Bind(_:to:withKeyPath:options:)



我对键值观察方法addObserver(_:forKeyPath:options:context:)及其伴随observeValue(forKeyPath:of:change:context:)bind(_:to:withKeyPath:options:)方法之间的区别感到困惑。

我知道根据Apple的Cocoa Bindings Programming Topics,bind方法似乎使用了KVO的概念,并且:

Cocoa 绑定还使用两种协议(NSEditorNSEditorRegistration(,这有助于确保在处置用户界面元素之前丢弃或提交任何挂起的编辑。

但是,我也注意到 KVO(及其姊妹 KVC(是来自Foundation的通知设计模式,而bind属于Foundation的对象运行时和AppKit的数据管理设计模式。

我似乎看到bind当您处理来自NSController的子类并且想要与像CoreData这样的模型层进行通信时都会使用。但是,苹果的键值观察编程指南说,

键值观察提供了一种机制,允许对象收到其他对象特定属性更改的通知。它对于应用程序中模型层和控制器层之间的通信特别有用。

我还在一些在线教程中看到过用于对象间通信的 KVO(这不是委托的用途吗?(。

bind和KVO似乎都在做同样的事情。

两者有什么区别?

我应该使用哪一个,做什么?

任何见解都会非常有帮助。提前感谢!

两者之间有什么区别?

KVO是可可绑定的支持技术。它允许一个对象观察另一个对象的属性(如果它们符合KVC标准(。

Cocoa 绑定是 KVO 之上的一个概念,它允许对象同步状态。通常是一个视图和一个控制器。

例如,如果我将 NSSlider 的"值"绑定绑定到我的类中名为"foo"的整数属性,则滑块将观察"foo"(使用 KVO(,并在我更改其值时更新 UI。如果用户通过 UI 更改滑块,它将为我更新"foo"。

请注意,绑定应由支持绑定的对象记录。绑定名称甚至不需要是属性名称。例如,请参阅 NSArrayController 绑定中的 contentSet。

我应该使用哪一个,做什么?

如果要观察属性值,请使用 KVO。

如果您正在使用Cocoa Bindings兼容对象(NSTableView,NSSlider,NSButton,NSArrayController等(,则应考虑Cocoa Bindings,以减少为同步UI和控制器数据而必须编写的胶水代码量。

最新更新