Наблюдение за ключом и значением (KVO) против привязки (_: to: withKeyPath: options :)

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

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

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

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

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

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

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

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

В чем разница между ними?

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

Любое понимание было бы действительно полезно. Заранее спасибо!


person Israel Flores    schedule 07.09.2018    source источник
comment
Биндинг построен на KVO, который построен на KVC. KVO более универсален, чем привязки, но есть причина для сходства.   -  person Ken Thomases    schedule 07.09.2018
comment
Связывание (с параметрами по умолчанию) гарантирует, что если установщик вызывается для значения одного объекта, вызываются установщики для других значений в других связанных объектах. КВО наблюдает. Вызывается сеттер, и вы получаете уведомление. КВО на этом заканчивается. Привязки означают, что после этого уведомления вызывается второй вызов установщика во втором (связанном) объекте.   -  person stevesliva    schedule 07.09.2018
comment
Короче говоря, KVO однонаправлен: наблюдатель получает уведомление при изменении свойства. Привязки являются двунаправленными: свойство привязано к представлению или представлению - изменение свойства изменяет представление, а изменение представления обновляет свойство.   -  person James Bucanek    schedule 08.09.2018


Ответы (1)


В чем разница между ними?

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

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

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

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

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

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

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

person pfandrade    schedule 09.09.2018