Я думаю, что вы запутались, потому что похожий шаблон используется (но не ограничивается!) Для двух общих задач, обе из которых применимы к вашей ситуации.
Узоры
Наличие внешнего объекта предоставляет данные для вас (это обычно называется источником данных ). См., Например, протокол UITableViewDataSource .
Это реализуется с помощью возвращаемого значения из метода: например,
- <b>(UITableViewCell *)</b>tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Объект , реализующий протокол , возвращает вызывающей стороне некоторое значение (в данном случае, ячейку).
Я упомяну об источниках данных: сам источник данных (объект, реализующий протокол) обычно содержит больше пользовательской логики вашего приложения, в то время как контроллер , которому требуется источник данных может быть более общим. Например, UITableView - это универсальный контроллер представления, который отображает табличное представление, в то время как класс, реализующий протокол UITableViewDataSource, должен знать детали базы данных вашего приложения.
(Однако, если быть точным, вы часто создаете подкласс UITableView для пользовательской логики, но чаще всего это логика представления, а не бизнес-логика.)
Эти методы вызывают логику вашего приложения и, как ожидается, немедленно возвратят .
Предоставление обратных вызовов после завершения загрузки данных.
Например, класс NSURLConnection имеет соответствующий протокол NSURLConnectionDelegate . Наиболее распространенный шаблон использования:
- Ваш объект создает NSURLConnection с самим делегатом .
- Вы настраиваете и запускаете соединение.
- Вы получаете прогресс и данные с помощью методов делегата, которые вы реализуете.
В этом случае объект , для которого требуется делегат , является вспомогательным объектом, который знает, как загрузить данные из URL-адреса в фоновом режиме. Методы делегата представляют собой обратные вызовы для логики вашего приложения и вызываются в любое время после того, как объекту приказано начать загрузку данных (или того, для чего он предназначен).
Делегирование также используется для других вещей в iOS, таких как задачи, связанные с пользовательским интерфейсом, выполняемые объектами, соответствующими UITableViewDelegate .
Ваша ситуация
Все это зависит от того, что представляет из себя ваше приложение и за что отвечает ваш контроллер представления - но, похоже, вы хотите, чтобы контроллер представления делегировал загрузку данных - в основном ему нужен источник данных, (Вам также следует подумать, может ли встроенный UITableView & UITableViewDataSource удовлетворить ваши потребности.) Но если ваш источник данных собирается асинхронно загружать данные из Интернета, ему может потребоваться реализовать некоторые обратные вызовы для загрузки данных через что-то вроде NSURLConnection.
Эти два метода не обязательно хорошо сочетаются друг с другом, поскольку контроллер представления ожидает, что его источник данных немедленно вернет данные, но источнику данных может потребоваться дождаться загрузки данных.
Вот почему в UITableView есть метод -reloadData
, поэтому объект, который служит источником данных, может сообщить ему, когда данные доступны . Возможно, вы захотите использовать такой шаблон в своем приложении.
(Но опять же, по всей вероятности, вам не нужно будет реализовывать полностью настраиваемый стек - либо вы можете комбинировать некоторые классы, чтобы уменьшить использование делегирования, либо вы можете использовать больше встроенных классов в соответствии с вашими потребностями.)