iPhone Dev - делегат или событие? - PullRequest
1 голос
/ 04 августа 2009

Во многих ситуациях, например, когда клавиатура отключается при использовании щелчков мыши, есть две опции: установить для делегата текстового поля значение self, принять протокол UITextFieldDelegate, а затем использовать метод

- (BOOL)textFieldShouldReturn:(UITextField *)textField; 

до resignFirstResponder и возврат YES. Но вы также можете

      addTarget:self 
         action:@selector(myMethod:) 
forControlEvent:UIControlEventDidEndOnExit]; 

или что-то в этом роде, с помощью метода did end при событии exit, а затем в методе [sender resignFirstResponder]. Итак, что является лучшим вариантом в подобных ситуациях: делегат или событие?

Ответы [ 3 ]

1 голос
/ 04 августа 2009

Быстрое эмпирическое правило заключается в том, что делегаты должны отвечать на вопрос "должен ли я?" от имени объекта, делегатом которого они являются. С другой стороны, события транслируются позже, чтобы дать слушателям понять, что что-то произошло.

В вашем случае, хотя вы можете вызвать [sender resignFirstResponder] в ответ на событие, вы смешиваете метафоры, делая это. Ваш делегат должен был уже принять решение скрыть клавиатуру (или нет), и передаваемое событие просто сообщает всем другим компонентам, что они спрятали клавиатуру.

0 голосов
/ 05 августа 2009

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

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

Оба имеют примерно одинаковую нагрузку для работы - с делегатом вы должны установить себя, а затем не забыть сбросить себя, прежде чем вас освободят. Вы должны сделать то же самое с уведомлениями, не забудьте начать прослушивание, а затем отменить подписку, прежде чем вас освободят.

Кроме того, вы должны постараться как можно больше убедиться, что вы отправляете уведомления в главном потоке, так как уведомления отправляются в том же потоке, с которого они начали. То же самое относится и к методам делегатов, не очень приятно вызывать метод делегата из какого-то другого таинственного потока!

0 голосов
/ 04 августа 2009

Делегат делает ваши объекты более пригодными для повторного использования, они являются адаптером, который позволяет любому объекту взаимодействовать с определенным поведением этого объекта и использовать объект. Я бы сказал, что делегат должен быть принят объектом, ответственным за сохранение состояния и определение поведения действий, которые будут происходить в объекте, который он использует. События должны использоваться для любых других объектов, которые вставлены в конкретное действие, которое выполняет объект, имеющий протокол (таким образом, объекты не несут ответственности за сохранение состояния объекта, определяющего протокол).

Например: контроллер представления, использующий текстовое поле, примет свой протокол для отклонения клавиатуры и любых других действий, которые могут возникнуть для текстового поля, возможно, другой контроллер выполнит некоторую анимацию, когда клавиатура будет отклонена, поэтому он будет зарегистрирован в текстовое поле как событие для получения события отклонения клавиатуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...