Каковы плюсы и минусы каждого из них?
Где я должен использовать их конкретно?
NSNotificationCenter против делегирования (используя протоколы)?
Ответ 1
Эмпирическое правило состоит в том, сколько клиентов хотели бы получать уведомление о событии. Если это в основном один объект (например, чтобы отклонить представление или действовать при нажатии кнопки или отреагировать на неудачную загрузку), вы должны использовать модель делегата.
Если событие, которое вы испускаете, может представлять интерес для многих объектов одновременно (например, с помощью поворота экрана, использования памяти, входа пользователя/выхода из системы), вы должны использовать NSNotificationCenter
.
Ответ 2
Их цели разные:
-
Уведомление используется для трансляции сообщений, возможно, для нескольких получателей, неизвестных отправителю.
-
Делегирование используется для отправки сообщений одному известному получателю, действующему от имени отправителя.
Ответ 3
Уведомления обычно лучше уведомлять пользовательский интерфейс об изменениях, происходящих и в других потоках. Документация Apple настоятельно препятствует использованию делегатов по потокам, где это возможно, как по соображениям стабильности, так и по производительности. На Mac они предлагают использовать Bindings, но, поскольку они не существуют на iPhone, уведомления, вероятно, будут вашим лучшим выбором.
Ответ 4
Рассмотрение производительности - хорошая идея (лучше делегировать небольшое количество уведомленных объектов, центр уведомлений лучше для большего количества объектов или запускать профилировщик), но я думаю, что более важный фактор, так как вы говорите о Objective-C и с меньшей вероятностью говорить о действительно высокопроизводительных частях вашей базы кода, которые, вероятно, будут записаны на языке C, сокращает временные зависимости между модулями.
Нет ничего, что помешало бы вам иметь массив делегатов, а не один делегат.
Я могу использовать NSNotificationCenter только для статуса любых компонентов сетевого стека, которые я создаю, и любых пользовательских интерфейсов мониторинга состояния устройства. Но для большинства соединений, не связанных с глобальным статусом приложения, я думаю, что в большинстве случаев более понятно использовать обычные интерфейсные контракты в Objective-C и проще для людей, следующих за вами, чем использовать NSNotificationCenter. На самом деле я никогда не использовал NotificationCenter для своих собственных событий и предпочитаю использовать делегатов для упрощения понимания кода кем-то другим, читающим мой код.
И, наконец, конечно, с уведомлениями/стандартным API вы не имеете выбора и должны использовать любой из двух методов, которые Apple запрещает для данного события.
Ответ 5
Уведомления лучше разделить компоненты пользовательского интерфейса. Он позволяет подключать любой вид без каких-либо изменений в ваших контроллерах или моделях. Определенно лучше для слабосвязанного дизайна.
Но для производительности между делегированием и уведомлением вам нужно подумать о частоте вызова.
Делегация может быть лучше для более частых событий, уведомления лучше для менее частых событий, но больше получателей. Это, чтобы спроектировать, что выбрать.
Ответ 6
Параметр между этими двумя использует шаблон наблюдателя без NSNotificationCenter
. Посмотрите на мою реализацию Objective-C здесь.