2011-10-23 1 views
30

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

+3

Попробуйте прочитать это, это действительно интересная статья в блоге о предмете для кодеров. http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/ – Daniel

ответ

36

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

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

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

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

ПС This sums up why I think KVO is broken

+4

Я знаю, что это старо, но я все еще хочу не согласиться с этим :) Эта статья дает отличные рекомендации. почему API KVO нарушен, но он также точно утверждает, что он по-прежнему является мощным инструментом. Есть много ситуаций, когда он может сэкономить много уродливого кода. Используйте его с оберткой, как тот, который он предоставил, если хотите, но используйте его. – Shinigami

+0

Используйте KVO, когда наблюдателям требуется немедленный ответ. И мы можем NSNotifications, когда наблюдатели могут ждать цикла событий. – MANN

+0

@MANN Я не думаю, что понимаю - уведомления не являются асинхронными, они также увольняются немедленно (хотя вы не получаете параметры willChange, которые вы получаете с KVO) – deanWombourne

12

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

2

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

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

1

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

+0

Насколько, собственно говоря, накладные расходы? – Liron

2

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^