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

问题描述 投票:1回答:1

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

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

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

但是,我也注意到KVO(和它的妹妹,KVC)是来自NotificationsFoundation设计模式,而bind属于FoundationObject RuntimeAppKitData Management设计模式。

我似乎看到bind在你处理来自NSController的子类时使用,并且你想与CoreData这样的模型层进行通信。但是,然后,Apple的Key-Value Observing Programming Guide说,

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

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

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

这两者有什么区别?

我应该使用哪一种?

任何见解都会非常有用。提前致谢!

ios swift macos cocoa cocoa-bindings
1个回答
1
投票

这两者有什么区别?

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。

© www.soinside.com 2019 - 2024. All rights reserved.