Делегаты какао используются для осуществления инверсии управления и уменьшения необходимости подкласса. Полностью возможно иметь несколько делегатов для одного объекта, но это делается, когда имеет смысл делегировать разные решения различным объектам. Отличным примером этого является WebView
от WebKit, в котором есть пять делегатов, отвечающих за такие разнообразные области, как политика загрузки и навигации по ресурсам.
Система событий-делегатов C#, которая позволяет объекту регистрироваться другим объектом, который будет уведомляться при возникновении определенного события, ближе всего к нескольким API-интерфейсам уведомлений, доступным из Cocoa. Различные интерфейсы API вы можете запустить через это, от самого высокого уровня к низшему:
NSNotificationCenter
NSDistributedNotificationCenter
CFNotificationCenter
- уведомления Дарвин.
Все похожие по духу, поэтому я рассмотрю только тот, который вы использовали бы в этом случае: 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];
Центр уведомлений будет просматривать список наблюдателей, найти те, которые соответствуют этому уведомлению, а также вызвать соответствующий метод.
Отличное представление об уведомлениях и их сходствах и отличиях от делегатов. –
Согласовано, это отличное значение для делегатов и уведомлений (слушателей). Это несколько нечеткая строка (например, мы часто уведомляем делегатов о завершении асинхронных задач), но она платит, чтобы понять различие. –