Подтвердить что ты не робот

Несколько делегатов в Objective C

Я прихожу из модели событий С#, и мне интересно, есть ли стандартный способ уведомления нескольких делегатов о событии?

У меня есть протокол ClassCDelegate, который я хочу реализовать как ClassA, так и ClassB. Есть ли способ, которым я могу назначить экземпляр ClassC как ClassA, так и ClassB в качестве делегатов без необходимости вручную создавать список переменных делегата в ClassC и проходить через них?

4b9b3361

Ответ 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];

Центр уведомлений затем просмотрит список наблюдателей, найдет те, которые соответствуют этому уведомлению, и вызовет соответствующий метод.

Ответ 3

Вы также можете, чтобы один объект обрабатывал событие, а затем пересылал его второму объекту.

Ответ 4

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

Ответ 5

У вас может быть только один объект-делегат. Если вы хотите уведомить различные объекты об изменениях, вы должны использовать NSNotificationCenter и отправлять сообщения NSNotification, которые ваши объекты могут прослушивать.

Ответ 6

Попробуйте MultiDelegate, он позволяет пересылать методы делегатов на любое количество объектов делегата.