Использование протоколов в Цели C для передачи данных между различными объектами? - PullRequest
0 голосов
/ 18 февраля 2011

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

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

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

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

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

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

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

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

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

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

2 голосов
/ 18 февраля 2011

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

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

Обратите внимание, что делегат не сохранен! Поэтому, если вы работаете со свойством, вам нужен параметр assign, а не retain.

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

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

Edit:

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

...