Ответ 1
Cocoa делегаты используются для выполнения инверсии управления и уменьшения необходимости подкласса. Полностью возможно иметь несколько делегатов для одного объекта, но это делается, когда имеет смысл делегировать разные решения различным объектам. Отличным примером этого является WebView
от WebKit, у которого есть пять делегатов, ответственных за области, столь же разнообразные, как и загрузка ресурсов и политика навигации.
С# event-delegate system, которая позволяет объекту регистрироваться другим объектом, который будет уведомляться при возникновении определенного события, ближе всего к нескольким API-интерфейсам уведомлений, доступным из Cocoa. Различные API, с которыми вы можете столкнуться, от самого высокого уровня до самого низкого:
-
NSNotificationCenter
-
NSDistributedNotificationCenter
-
CFNotificationCenter
- Уведомления Darwin.
Все схожи по духу, поэтому я рассмотрю только тот, который вы использовали бы в этом случае: NSNotificationCenter
.
Наблюдатели, такие как ClassA и ClassB, регистрируют интерес к уведомлениям с помощью NSNotificationCenter
. Они могут указать интерес к
- уведомления с определенным именем из определенного объекта
- уведомления с определенным именем из любого объекта
- уведомления от определенного объекта.
Когда соответствующее уведомление отправляется в центр уведомлений, наблюдатели уведомляются, вызывая метод, который они поставили во время регистрации в центре уведомлений. Метод всегда имеет один и тот же тип: он ничего не возвращает и принимает один аргумент, объект NSNotification
.
Обычно вы справляетесь с ситуацией, если ClassC объявляет константу для имени уведомления в своем заголовочном файле, например,
extern NSString *const ClassCSomethingDidHappenNotification;
Заинтересованные наблюдатели, такие как ClassA и ClassB, могут зарегистрировать интерес к этому уведомлению:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleSomethingDidHappen:)
name:ClassCSomethingDidHappenNotification
object:aClassCObject];
Вместо регистрации селектора и добавления метода наблюдателю для обработки обратного вызова вы также можете зарегистрировать очередь операций и блок для выполнения в этой очереди при отправке соответствующего уведомления.
При возникновении события, связанного с уведомлением, ClassC отправляет уведомление в центр уведомлений:
[[NSNotificationCenter defaultCenter]
postNotificationName:ClassCSomethingDidHappenNotification
object:self];
Центр уведомлений затем просмотрит список наблюдателей, найдет те, которые соответствуют этому уведомлению, и вызовет соответствующий метод.