Наблюдение значения ключа (KVO) против привязки (_: to: withKeyPath: options :) - PullRequest
0 голосов
/ 07 сентября 2018

Меня смущает различие между методом наблюдения значения ключа addObserver(_:forKeyPath:options:context:) и сопровождающим его observeValue(forKeyPath:of:change:context:) против метода bind(_:to:withKeyPath:options:).

Я знаю, что согласно темам программирования связывания какао от Apple метод bind, кажется, использует концепции KVO и что:

Привязки какао также используют два протокола - NSEditor и NSEditorRegistration - которые помогают гарантировать, что любые ожидающие изменения будут либо отброшены, либо зафиксированы до удаления элементов пользовательского интерфейса.

Но я также заметил, что KVO (и его сестра, KVC) - это шаблон уведомлений от Foundation, в то время как bind принадлежит Foundation Object Runtime и AppKit Управление данными шаблон проектирования.

Мне кажется, bind используется, когда вы имеете дело с подклассом из NSController, и вы хотите общаться с модельным слоем, таким как CoreData. Но затем в руководстве по программированию Apple Key-Value написано:

Наблюдение значения ключа обеспечивает механизм, который позволяет объектам получать уведомления об изменениях определенных свойств других объектов. Это особенно полезно для связи между уровнями модели и контроллера в приложении.

Я также видел KVO, используемый для межобъектной связи ( не для этого ли нужны делегаты? ) в нескольких онлайн-уроках.

И bind, и KVO, похоже, делают одно и то же.

В чем разница между этими двумя?

Какой мне использовать и для чего?

Любое понимание было бы очень полезно. Заранее спасибо!

1 Ответ

0 голосов
/ 09 сентября 2018

В чем разница между этими двумя?

KVO - это технология поддержки привязки какао. Это позволяет объекту наблюдать собственность другого (если они соответствуют KVC).

Привязки какао - это концепция поверх KVO, которая позволяет объектам синхронизировать состояние. Обычно вид и контроллер.

Например, если у меня есть привязка «значения» NSSlider, привязанная к целочисленному свойству с именем «foo» моего класса, ползунок будет наблюдать «foo» (используя KVO) и обновлять пользовательский интерфейс всякий раз, когда я изменяю его значение. И если пользователь изменяет ползунок через пользовательский интерфейс, он обновит для меня «foo».

Обратите внимание, что привязки должны документироваться объектами, которые поддерживают это. Имя привязки даже не обязательно должно быть именем свойства. Например, см. contentSet из привязок NSArrayController.

Какой я должен использовать и для чего?

Если вы хотите наблюдать за значениями свойств, используйте KVO.

Если вы работаете с объектами, совместимыми с привязками Какао (NSTableView, NSSlider, NSButton, NSArrayController и т. Д.), Вам следует учитывать привязки Какао к уменьшению количества связующего кода, который вам придется писать для синхронизации данных пользовательского интерфейса и контроллера.

...