键值观察(KVO)与绑定(_:to:withKeyPath:options :)

时间:2018-09-07 04:32:29

标签: ios swift macos cocoa cocoa-bindings

我对键值观察方法addObserver(_:forKeyPath:options:context:)与它的附带observeValue(forKeyPath:of:change:context:)之间的区别感到困惑。

我知道,根据苹果公司的Cocoa Bindings Programming Topicsbind(_:to:withKeyPath:options:)方法似乎使用了KVO的概念,并且:

  

可可绑定还使用两种协议bindNSEditor,这有助于确保在处置用户界面元素之前,所有待处理的编辑都被丢弃或提交。

但是,我还注意到KVO(及其姐妹KVC)是NSEditorRegistration的{​​{3}}设计模式,而Foundation属于bind的{​​{3} }和Foundation的{​​{3}}设计模式。

当您处理AppKit的子类并且想要与bind之类的模型层进行通信时,似乎会使用NSController。但是,苹果公司的Notifications说,

  

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

在一些在线教程中,我还看到了KVO用于对象间通信(这不是代表的目的吗?)。

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

两者之间有什么区别?

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

任何见解都会非常有帮助。预先感谢!

1 个答案:

答案 0 :(得分:1)

  

两者之间有什么区别?

KVO是可可粘合剂的支撑技术。它允许对象观察他人的属性(如果它们符合KVC)。

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

例如,如果我有一个NSSlider的“值”绑定绑定到我班上一个名为“ foo”的整数属性,则滑块将观察“ foo”(使用KVO)并在每次更改其值时更新UI。如果用户通过用户界面更改了滑块,它将为我更新“ foo”。

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

  

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

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

如果您正在使用与Cocoa Bindings兼容的对象(NSTableView,NSSlider,NSButton,NSArrayController等),则应考虑使用Cocoa Bindings来减少同步UI和Controller数据所需编写的粘合代码量。