2011-02-18 2 views
0

Эй, ребята, у меня в настоящее время есть представление в виде корневого стола, в котором есть панель инструментов внизу, а также ярлыки и кнопка обновления внутри, как и панель инструментов приложения Mail. Этот контроллер представления корневых таблиц получает данные от сервера путем выделения и инициализации класса DataUpdater. Внутри этого класса используются методы делегата NSURLConnection, вызываемые при общении с сервером.Использование протоколов в Objective C для передачи данных между различными объектами?

Как вы можете догадаться, мне нужно знать, когда вызываются определенные функции (делегаты) в классе DataUpdater и значения параметров, переданных этим функциям делегата, чтобы я мог соответствующим образом обновлять метки на панели инструментов (т.е. Подключение ..., Обновлено и т. Д.).

Проблема, с которой я столкнулась, заключается в определении того, как уведомить контроллер представления корневой таблицы о том, что происходит в этих методах делегата. Могу ли я использовать протоколы, если да, то как? Я просматриваю документацию и не совсем понимаю, как я получу этот эффект. Или вы предлагаете мне реализовать свою программу по-другому?

Заранее благодарен!

ответ

2

Протокол - это своего рода договор, в котором говорится: Я обещаю предоставить необязательные методы, определенные в протоколе, и, возможно, даже необязательные. Цель - как интерфейсы Java: работать с отсутствием множественного наследства.

Шаблон делегирования в Objective-C обычно работает следующим образом: вы определяете протокол, а затем в своем классе вы определяете переменную типа id<MyProtocol> myDelegate; и определяете сеттер и, возможно, getter (либо с помощью обычных методов, например - (void)setDelegate:(id<MyProtocol>)aDelegate;, либо через свойства.

Обратите внимание, что делегат не сохранил! Так что, если вы работаете с собственностью, необходимо вариант assign, не retain.

Теперь обратно в вашем классе, вы проверяете ли myDelegate равна нулю и если нет, вы можете напрямую вызвать его необязательные методы. u хотите вызвать дополнительный метод, сначала вам нужно проверить его наличие через respondsToSelector:.

Итак, если вы решили использовать шаблон делегата, вам нужно определить протокол, добавить этот протокол в свой контроллер представления таблицы корневого каталога, реализовать там необходимые методы и обязательно позвонить [foo setDelegate:self]; или что-то подобное, чтобы сообщить другому пользователю класс, который является контроллером представления корневой таблицы. И, конечно, реализуйте вызовы делегатов в своем классе.

Edit:

Альтернативой может быть использование NSNotification с, BTW. Преимущество уведомлений заключается в том, что вы можете прослушивать и реагировать на несколько объектов. Недостатком является то, что вы не можете (напрямую) передать значения обратно. Например, вы можете определить метод делегата, который просит делегата, делать что-то или нет. Это невозможно с уведомлениями, это больше похоже на крик в комнату, а не на индивидуальный разговор.

+0

Благодарим за подробное объяснение, однако, что мне действительно нужно, чтобы заставить меня двигаться, был твердым примером, который я нашел здесь: http://iphonedevelopertips.com/objective-c/the-basics-of-protocols- and-delegates.html Хотя этот пример сохраняет делегат, а не назначает его, я сделал то же самое, и он, похоже, не делает ничего вредного, по крайней мере, изначально. Но я возьму ваш совет и совет GorillaPatch и использую назначение. ;) Еще раз спасибо! – Stunner

2

Ответ DarkDust о протоколах в порядке, но я хотел бы добавить к нему некоторые вещи.

Одна из основных вещей, которые часто забываются, когда дело доходит до делегации, - это Право собственности на объект. Когда программа запускается, создается дерево объектов.Его корневой объект является делегатом приложения и, например, ему принадлежит контроллер навигации, которому принадлежат отдельные контроллеры представлений, которым принадлежит представление, а представление принадлежит его подзонам и т. Д.

Часто возникает вопрос: «Почему делегат не сохранился, просто назначен?» Проблема в том, что если вы отправляете сообщение на освобожденный объект, программа вылетает из строя. Итак, как вы убедитесь, что делегат остается вокруг? Ответ - это собственность объекта.

Я приведу вам пример: UITableView и его источник данных, который является TableViewController, который является всего лишь делегатом. TableViewController содержит ссылку с свойством вида в UITableView, поэтому он имеет TableView. Это означает, что когда tableView жив, должен присутствовать и его родительский объект, который является делегатом UITableView. Поэтому нет никакой опасности, что делегат уйдет.

В конце концов, это снова все о управлении памятью.

Возьмите домашнее сообщение: подумайте о владении объектом, сделайте ваш программный режим модульным, проще в обслуживании и приведет к более слабой связи между отдельными объектами.

+0

Спасибо за объяснение и советы, имеет смысл! – Stunner

+0

Добро пожаловать. Я думаю, что иногда трудно отступить и взглянуть на общие понятия, когда вы глубоко разбираетесь в рамках. – GorillaPatch

Смежные вопросы