КВО против NSNotification против протокола / делегатов? - PullRequest
33 голосов
/ 23 октября 2011

Хотя у меня есть идея, которую использовать когда, но точное использование до сих пор мне не ясно. Может кто-нибудь объяснить примером ...? Спасибо.

Ответы [ 5 ]

39 голосов
/ 23 октября 2011

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

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

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

Надеюсь, это поможет.

PS Это подводит итог, почему я считаю, что KVO не работает

14 голосов
/ 23 октября 2011

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

2 голосов
/ 16 марта 2013

Даже если все три варианта удовлетворят ваши потребности в ситуации, делегат все равно будет предпочтительным вариантом:

  1. Возможность повторного использования.
  2. Самодокументировано.Изучив заголовочный файл класса, можно сразу узнать, что / как происходит обмен данными.
2 голосов
/ 23 октября 2011

Делегирование - это шаблон проектирования, который вы используете, когда хотите, чтобы какой-то другой объект изменил поведение отправителя.Пример: окна терминала избегают показывать любые строки или символы, которые обрезаны по краям окна, потому что делегат окна терминала изменяет размер окна, чтобы гарантировать это.

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

1 голос
/ 12 октября 2012

По моему мнению, KVO лучше из-за его нулевых накладных расходов.Уведомления имеют накладные расходы, даже если вы их не используете / не наблюдаете.Чтобы улучшить это, вы можете использовать разные NotificationCenters, но даже с этим будут некоторые накладные расходы (поправьте меня, если я ошибаюсь).KVO немного сложен, но его стоит, когда нужно наблюдать много вещей.

...