Возвращаемое значение асинхронного HTTP-запроса в Swift

Я сейчас занимаюсь проблемой дизайна. Я пишу приложение Swift, у которого есть раскадровка с несколькими ViewControllers и классом HTTPRequests, который выполняет запросы GET и POST на веб-службе RESTful.

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

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

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

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

Изменить: Благодаря вашим ответам и этой записи в блоге я мог успешно реализовать подход 2 с делегатами.

1 ответ

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

Другие вопросы по тегам