NSNotificationCenter против делегирования (с использованием протоколов)? - PullRequest
66 голосов
/ 18 декабря 2009

Каковы плюсы и минусы каждого из них?
Где я должен их использовать конкретно?

Ответы [ 6 ]

100 голосов
/ 18 декабря 2009

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

Если создаваемое вами событие может представлять интерес для многих объектов одновременно (например, поворот экрана, использование памяти, вход / выход пользователя из системы), то вам следует использовать NSNotificationCenter.

34 голосов
/ 18 декабря 2009

Их цели различны:

  • Уведомление используется для рассылки сообщений, возможно, нескольким получателям, неизвестным от отправителя.

  • Делегирование используется для отправки сообщений одному известному получателю, действующему от имени отправителя.

12 голосов
/ 18 декабря 2009

Уведомления, как правило, лучше уведомлять пользовательский интерфейс об изменениях, происходящих и в других потоках. В документации Apple категорически не рекомендуется использовать делегатов между потоками, где это возможно, как по соображениям стабильности, так и производительности. На Mac они предлагают использовать привязки, но, поскольку на iPhone их нет, вероятно, следующие ваши лучшие ставки - это уведомления.

7 голосов
/ 18 декабря 2009

Считать производительность хорошей идеей (лучше делегировать для небольшого числа объектов с уведомлением, лучше использовать центр уведомлений для большего количества объектов, или это? Запустить профилировщик), но я думаю, что более важный фактор, так как вы говорите об Objective -C и менее вероятно говорить о действительно высокопроизводительных частях вашей кодовой базы, которые, вероятно, будут написаны на C, уменьшает зависимость времени компиляции между модулями.

Ничто не мешает иметь массив делегатов, а не один делегат.

Я мог бы использовать NSNotificationCenter только для статуса всех компонентов сетевого стека, которые я делаю, и любых пользовательских интерфейсов мониторинга состояния устройства. Но для большинства связей, не связанных с глобальным статусом приложения, я думаю, что в большинстве случаев проще использовать обычные интерфейсные контракты в Objective-C и легче следовать людям, которые идут за вами, чем использовать NSNotificationCenter. На самом деле я никогда не использовал NotificationCenter для своих собственных пользовательских событий и предпочитаю использовать делегаты для облегчения понимания кода кем-то, кто читает мой код.

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

6 голосов
/ 15 июля 2011

Уведомления лучше для разделения компонентов пользовательского интерфейса. Это позволяет вам подключить любой вид без каких-либо изменений в ваших контроллерах или моделях. Определенно лучше для слабосвязанной конструкции.

Но для производительности между делегированием и уведомлением вам нужно подумать о частоте вызова.

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

3 голосов
/ 13 октября 2010

Опция между этими двумя - использовать шаблон наблюдателя без NSNotificationCenter. Посмотрите на мою реализацию Objective-C здесь .

...