【问题标题】:Key-Value Observing (KVO) vs. Bind(_:to:withKeyPath:options:)键值观察 (KVO) 与 Bind(_:to:withKeyPath:options:)
【发布时间】:2019-02-12 09:10:47
【问题描述】:

我对 Key-Value Observing 方法 addObserver(_:forKeyPath:options:context:) 与其随附的 observeValue(forKeyPath:of:change:context:) 之间的区别感到困惑 bind(_:to:withKeyPath:options:) 方法之间的区别。

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

Cocoa 绑定还使用两个协议——NSEditorNSEditorRegistration——这有助于确保在用户界面元素被释放之前,任何待处理的编辑都被丢弃或提交。

但是,我也注意到 KVO(及其姐妹,KVC)是来自 FoundationNotifications 设计模式,而 bind 属于 FoundationObject RuntimeAppKitData Management设计模式。

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

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

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

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

两者有什么区别?

我应该使用哪一个?

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

【问题讨论】:

  • Bindings 是建立在 KVO 之上的,而 KVO 是建立在 KVC 之上的。 KVO 比 Bindings 更通用,但有相似之处是有原因的。
  • 绑定(使用默认选项)保证如果为一个对象的值调用 setter,则调用其他绑定对象中其他值的 setter。 KVO 正在观察。一个 setter 被调用,你会收到一个通知。 KVO 到此结束。绑定意味着在该通知之后,将调用第二个(绑定)对象中的第二个 setter 调用。
  • 简而言之,KVO 是单向的:当属性更改时,观察者会收到通知。绑定是双向的:属性“绑定”到视图或表示——更改属性会更改视图,更改视图会更新属性。

标签: ios swift macos cocoa cocoa-bindings


【解决方案1】:

两者有什么区别?

KVO 是 Cocoa Bindings 的支持技术。它允许一个对象观察另一个对象的属性(如果它们符合 KVC)。

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

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

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

我应该使用哪一个以及用于什么?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2012-01-16
    相关资源
    最近更新 更多