KVO против NSNotifications

Есть ли преимущества в использовании KVO вместо более «общей» (и, на мой взгляд, более надежной) функции NSNotifications?


person Pierre Watelet    schedule 03.05.2011    source источник
comment
Какая часть KVO, по вашему мнению, нестабильна?   -  person hooleyhoop    schedule 03.05.2011
comment
Недостатки хорошо обсуждаются в ссылке на Cocoa Builder. Я дал свой ответ. В основном проблемы связаны с тем, что вам нужно обрабатывать все уведомления KVO в одной функции, что является хрупким при создании подклассов.   -  person zoul    schedule 03.05.2011
comment
Хорошо, я бы не согласился с этим. KVO не является хрупким при создании подклассов - использование селектора в качестве контекста - это хитрость, а не то, для чего он нужен.   -  person hooleyhoop    schedule 03.05.2011
comment
Как насчет removeObserver:forKeyPath:, который не принимает никакого контекста? Что, если и мой класс, и его подкласс захотят наблюдать один и тот же путь и прекратить наблюдение в разные моменты?   -  person zoul    schedule 05.05.2011
comment
@hooleyhoop Я не возражаю против единственного обработчика, но меня раздражает отслеживание того, наблюдаю ли я за объектом. Я все еще использую KVO, но если бы существовала версия KVO с автоматическим подсчетом ссылок (ARC), я бы, вероятно, использовал ее.   -  person ma11hew28    schedule 11.04.2014
comment
Обновление: в iOS 6 и новее viewDidUnload больше не вызывается. Итак, теперь мы можем начать наблюдение в viewDidLoad и закончить наблюдение в deinit, зная, что вызовы каждого метода однозначны.   -  person ma11hew28    schedule 12.11.2014


Ответы (2)


Я страстно ненавижу KVO, главным образом потому, что он заставляет меня направлять все уведомления KVO через один обработчик. Я использую все, что есть в наличии, если у меня есть выбор. Но KVO имеет явное преимущество в том, что он доступен для многих классов стандартной библиотеки - если вы хотите наблюдать за изменениями свойств некоторых классов из стандартной библиотеки, KVO может быть вашим единственным вариантом. Есть одна очень интересная ветка на Cocoa Builder о КВО и различных вариантах наблюдения и привязки.

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

person zoul    schedule 03.05.2011

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

Это гораздо менее «общий» и гораздо менее надежный, чем использование KVO.

person hooleyhoop    schedule 03.05.2011