【问题标题】:KVO versus NSNotifications [duplicate]KVO 与 NSNotifications [重复]
【发布时间】:2024-04-28 21:50:01
【问题描述】:

使用 KVO 代替 NSNotifications 的更“通用”(而且我认为更强大)功能有什么优势吗?

【问题讨论】:

  • 您认为 KVO 的哪一点不健壮?
  • 我在回答中给出的Cocoa Builder link 很好地讨论了缺点。大多数问题源于您必须在单个函数中处理所有 KVO 通知这一事实,这在子类化时很脆弱。
  • 好的,我不同意这一点。 KVO 在子类化时并不脆弱 - 使用 Selector 作为 Context 是一种技巧,而不是它的用途。
  • 不带任何上下文的removeObserver:forKeyPath: 怎么样?如果我的班级及其子班级都想观察相同的路径并在不同的时刻停止观察怎么办?
  • @hooleyhoop 我不介意单个处理程序,但keeping track of whether I'm observing an object is annoying。我仍然使用 KVO,但如果有 KVO 的自动引用计数 (ARC) 版本,我可能会使用它。

标签: ios cocoa-touch nsnotificationcenter key-value-observing


【解决方案1】:

我非常讨厌 KVO,主要是因为它迫使我通过单个处理程序路由所有 KVO 通知。如果可以选择,我会使用任何其他可用的东西。但是 KVO 具有可用于标准库中的许多类的明显优势——如果您想观察标准库中某些类的属性更改,KVO 可能是您唯一的选择。有一个very interesting thread on Cocoa Builder 是关于 KVO 和各种观察和绑定选项的。

(我应该补充一点,我只对 KVO 作为高级观察接口感到不满。我认为它作为其他技术的管道非常好,尤其是绑定。)

【讨论】:

    【解决方案2】:

    为了使用 NSNotifications 来做类似于 KVO 的事情,您必须为要观察的每个属性编写自定义样板访问器方法。

    与使用 KVO 相比,它的“通用性”和鲁棒性都差得多。

    【讨论】: