ТАК говорит мне, что этот вопрос субъективен и, вероятно, будет закрыт.Это действительно субъективно, потому что я спрашиваю мнение опытных разработчиков Objective-C.Должен ли я опубликовать это где-то еще?Пожалуйста, сообщите.
Совершенно новый для Objective-C, хотя и довольно уверенный в концепции написания кода ООП, я с самого начала боролся с дилеммой NSNotification vs Delegate.Я написал несколько вопросов на эту тему в одиночку.Я понимаю суть, я думаю.Уведомления передаются по всему миру, поэтому их не следует использовать для уведомления о тесно связанных объектах.Делегаты существуют для передачи задач другому объекту, который действует от имени делегированного объекта.Хотя это может быть использовано для тесно связанных объектов, я нахожу рабочий процесс многословным (новый класс, новый протокол и т. Д.), И одно только слово «делегирование» заставляет меня думать об армиях и начальстве и в целом заставляет меня чувствовать себя неловко.
Откуда я (AS3), есть вещи, называемые событиями.Они на полпути между делегатами и NSNotifications и в значительной степени управляли миром флеш-уведомлений, пока совсем недавно не появился мистер Роберт Пеннер и не выразил свое недовольство событиями.Поэтому он написал библиотеку, которая сейчас широко используется в сообществе AS3, под названием Signals.Вдохновленные событиями C # и Сигналами / Слотами в Qt, эти сигналы на самом деле являются свойствами объектов, к которым вы обращаетесь извне и добавляете слушателей.С сигналом можно сделать гораздо больше, но по сути это все.
Поскольку концепция настолько скромна, я попробовал и написал свой собственный класс сигналов в Objective-C. Я указал здесь Signal.h / .m .
Способ использования этого для уведомления класса A о событии в классе B может выглядеть следующим образом:
// In class b, assign a Signal instance to a retained property:
self.awesomeThingHappened = [[[Signal alloc] init] autorelease];
// In class a, owner of class b, listen to the signal:
[b.awesomeThingHappened add:self withSelector:@selector(reactToAwesomeThing)];
// And when something actually happens, you dispatch the signal in class b:
[self.awesomeThingHappened dispatch];
// You might even pass along a userInfo dictionary, your selector should match:
[self.awesomeThingHappened dispatchWithUserInfo:userInfo];
Я надеюсь, что он придерживается правильных правил управления памятью, но когда сигнал освобождается, он должен автоматически удалить всех слушателей и тихо исчезнуть.Подобный сигнал не должен являться общей заменой уведомлений и делегирования, но есть много ситуаций, когда встречные ситуации встречаются, когда я чувствую, что Сигнал чище, чем два других.
Мой вопрос для stackoverflow заключается в том, чтовы думаете о решении, как это?Вы бы мгновенно удалили это из своего проекта, если бы один из ваших стажеров включил его?Вы бы уволили своего сотрудника, если он уже закончил свою практику?Или, может быть, уже есть что-то подобное, но гораздо более грандиозное, что вы бы использовали вместо этого?
Спасибо за ваше время, EP.
РЕДАКТИРОВАТЬ: Позвольте мне датьконкретный пример того, как я использовал это в проекте iOS.
Рассмотрим этот сценарий четырех типов объектов с вложенным владением.Есть контроллер представления, владеющий оконным менеджером, владеющий несколькими окнами, каждое из которых имеет представление с элементами управления, среди которых кнопка закрытия.Возможно, здесь есть недостаток дизайна, но это не главное в примере: P
Теперь, когда нажимается кнопка закрытия, распознаватель жестов запускает первый селектор в объекте окна.Это должно уведомить оконный менеджер, что он закрывается.Диспетчер окон может затем решить, появляется ли другое окно или окна вообще скрыты, и в этот момент контроллеру представления необходимо получить выпуклость, чтобы включить прокрутку на главном представлении.
Уведомления от окна до оконного менеджера и от оконного менеджера до контроллера просмотра - это те, которые я сейчас реализовал с помощью сигналов.Это могло бы быть делом делегирования, но для всего лишь «близкого» действия создание двух делегированных протоколов казалось настолько многословным.С другой стороны, поскольку связь этих объектов очень хорошо определена, это также не похоже на случай с NSNotifications.На самом деле, с KVO я также не могу наблюдать изменения значения, потому что это просто нажатие кнопки.Прослушивание какого-то «скрытого» состояния заставило бы меня сбросить этот флаг только при повторном открытии окна, что затрудняет его понимание и приводит к небольшим ошибкам.