В чем разница между NSNotificationCenter и техникой наблюдения значения ключа? - PullRequest
8 голосов
/ 12 августа 2011

Я только что прочитал пару уроков, касающихся КВО, но я еще не обнаружил причину его существования.Разве NSNotificationCenter не является более простым способом наблюдения объектов?

Я новичок в Stackoverflow, поэтому просто скажите мне, если что-то не так в том, как я задаю этот вопрос!

1 Ответ

15 голосов
/ 12 августа 2011

Уведомления и KVO выполняют аналогичные функции, но с разными компромиссами.

  • Уведомления просты для понимания. KVO ... сложно ... понять (по крайней мере, понять, как его использовать хорошо ).

  • Уведомления требуют изменения наблюдаемого кода. Наблюдаемое должно явно генерировать каждое уведомление, которое оно предлагает. KVO прозрачен для наблюдаемого кода, если наблюдаемый код соответствует KVC (что и должно быть в любом случае).

  • Уведомления имеют накладные расходы, даже если вы их не используете. Каждый раз, когда наблюдаемый код публикует уведомление, его необходимо сверять с каждым наблюдением в системе, даже если никто не наблюдает за этим объектом (даже если никто ничего не наблюдает). Это может быть очень нетривиальным, если в системе более нескольких сотен наблюдений. Это может быть серьезной проблемой, если их несколько тысяч. КВО имеет нулевые накладные расходы для любого объекта, который фактически не наблюдается.

В целом, я не рекомендую KVO из-за некоторых специфических проблем с реализацией, которые, по моему мнению, затрудняют правильное использование. Трудно наблюдать объект, который также наблюдает ваш суперкласс без специальных знаний о вашем суперклассе. Его сильная зависимость от строковых литералов затрудняет обнаружение мелких опечаток во время компиляции. В общем, я считаю, что код, который в значительной степени зависит от него, становится сложным и трудным для чтения, и начинает обнаруживать жуткие действия на расстоянии. NSNotification код имеет тенденцию быть более простым, и вы можете видеть, что происходит. Случайный код запускается не тогда, когда вы этого не ожидали.

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

Есть третий путь. Вы можете хранить список слушателей и отправлять им сообщения, когда все меняется, как методы делегирования. Некоторые люди называют эти «многоадресные делегаты», но «слушатели» здесь более корректны, потому что они не изменяют поведение объекта, как делегат. Это может быть значительно быстрее, чем NSNotification, если вам нужно много наблюдений в системе, не добавляя сложности KVO.

...