Подтвердить что ты не робот

KVO против NSNotification против протокола/делегатов?

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

KVO полезно слушать "без ведома класса", хотя, конечно, это не так, класс, к которому применяется KVO, менять не нужно.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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