NSNotificationCenter против делегирования (с использованием протоколов)?

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам