NSNotificationCenter по сравнению с делегацией (использующий протоколы)?

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

67
задан EEE 31 December 2009 в 08:20
поделиться

4 ответа

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

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

103
ответ дан 24 November 2019 в 14:30
поделиться

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

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

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

35
ответ дан 24 November 2019 в 14:30
поделиться

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

12
ответ дан 24 November 2019 в 14:30
поделиться

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

Нет ничего чтобы у вас не было массива делегатов, а не одного делегата.

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

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

7
ответ дан 24 November 2019 в 14:30
поделиться