我对键值观察方法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)是来自Notifications的Foundation
设计模式,而bind
属于Foundation
的Object Runtime和AppKit
的Data Management设计模式。
我似乎看到bind
在你处理来自NSController
的子类时使用,并且你想与CoreData
这样的模型层进行通信。但是,然后,Apple的Key-Value Observing Programming Guide说,
键值观察提供了一种机制,允许对象通知其他对象的特定属性的更改。它对应用程序中模型和控制器层之间的通信特别有用。
在一些在线教程中,我也看到KVO用于对象间通信(不是代表的用途吗?)。
bind
和KVO似乎都做了同样的事情。
这两者有什么区别?
我应该使用哪一种?
任何见解都会非常有用。提前致谢!
这两者有什么区别?
KVO是Cocoa Bindings的支持技术。它允许对象观察另一个属性(如果它们符合KVC)。
Cocoa Bindings是KVO之上的一个概念,它允许对象同步状态。通常是视图和控制器。
例如,如果我将NSSlider的“value”绑定绑定到我的类的名为“foo”的整数属性,则滑块将观察“foo”(使用KVO)并在每次更改其值时更新UI。如果用户通过UI更改滑块,它将为我更新“foo”。
请注意,绑定应由支持它的对象记录。绑定名称甚至不需要是属性名称。例如,请参阅NSArrayController绑定中的contentSet。
我应该使用哪一种?
如果要观察属性值,请使用KVO。
如果您正在使用Cocoa Bindings兼容对象(NSTableView,NSSlider,NSButton,NSArrayController等),您应该考虑减少用于同步UI和Controller数据时必须编写的粘合代码量的Cocoa Bindings。