我对键值观察方法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
的通知设计模式,而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和控制器数据而必须编写的胶水代码量。