2015-02-07 2 views
0

У меня есть проблема с дизайном прямо сейчас. Я пишу Swift App, у которого есть раскадровка с несколькими ViewControllers и класс HTTPRequests, который выполняет запросы GET и POST в RESTful Webservice.Asynchronus HTTP Request return Значение в Swift

Моя проблема прямо сейчас следующая. С контроллера представления я должен выполнить запрос GET в Webservice для извлечения данных. Полученные данные должны отображаться через этот контроллер представления на конкретном представлении. Я вижу две возможности, чтобы достичь этого прямо сейчас:

  1. Поместите функцию запроса в ViewController. Выполните запрос asynchronus и обновите представление в этой задаче asynchronus, как только будут получены данные. Мне не нравится этот подход по двум причинам. Во-первых, я не хочу функцию Request внутри ViewController, потому что мне нужна такая же функция в нескольких ViewControllers, и это приводит к дублированию кода. Во-вторых, я не хочу обновлять представление внутри задачи asynchronus.

  2. Поместите функцию запроса в класс HTTPRequests (Singleton). Вызовите запросы из ViewController и получите возвращаемое значение обратно. С помощью этого значения ViewController может обновить свое представление. Мне нравится этот подход, потому что он в дизайне касается «чище». Моя единственная проблема - это возвращаемое значение. Как я могу вернуть значение из задачи асинхронов в Swift? Если возможно, пожалуйста, используйте примеры кода.

Или есть лучший подход, чем эти два?

Edit: Благодаря вашим ответам и this Blog Post я мог бы успешно реализовать подход 2 с делегатами.

+0

Вы должны использовать подход 2 с шаблоном делегата. – Paulw11

+0

Если у вас достаточно много времени, чтобы изучить их, я настоятельно рекомендую использовать для этого цель «Будущее/обещание» или «FRP» на функциональном языке. – findall

+0

Спасибо за подсказки. Я новичок в программировании на iOS, поэтому мне нужно научиться разбираться с делегатами. В этом случае я также посмотрю на Futures, я знаю их уже немного от Java. –

ответ

0

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

+0

Спасибо за ваш комментарий. Да, какой-то код будет приятным;) –