Alamofire - важный сетевой инструмент, который должен иметь за плечами любой разработчик iOS. Фреймворк элегантно написан полностью на Swift.
Сама структура служит абстрактным уровнем функциональности поверх существующего сетевого стека Apple. Итак, ваши существующие знания о сетевом ландшафте iOS по-прежнему в силе. И вы будете строить на этом поверх.
В этом руководстве по Alamofire для iOS вы изучите следующие темы:
- Создание масштабируемого шаблона для организации сетевого стека.
- Обработка различных ответов об ошибках.
- Работа с API аутентификации.
- Установка политики повтора для сбоев запроса.
- Работа с разными типами запросов.
- Отслеживание статуса доступности Интернета.
Начиная
Начните с скачивания материалов проекта из этого репозитория.
Откройте DnDRealm.xcworkspace в стартовом проекте. Строй и беги.
Приложение, которое вы создадите, позволяет вам искать снаряжение и монстров Dungeons and Dragons, используя DnD API. Также в приложении будет возможность извлекать изображения монстров с помощью Imgur API. И вы реализуете загрузку изображений.
Готовы исследовать мир Dungeons and Dragons? Пора окунуться!
Понимание запросов маршрутизации
По мере увеличения размеров сетевых конечных точек приложения количество строк кода растет вместе с ними. Шаблон маршрутизатора - важная часть организации сетевого стека.
Маршрутизатор - это тип, который определяет маршруты или URLRequest
компоненты. URLRequest
представляет информацию о своем Request
, такую как URL-адрес, параметры, заголовки, типы методов и политики. Как показано ниже:
Alamofire предоставляет протоколы URLConvertible
и URLRequestConvertible
для упрощения магии маршрутизации.
Создание маршрутизатора DnD
В настоящее время HTTP-запросы для выборки и поиска используют конечные точки строк. Это грязно. Добавьте маршрутизатор для инкапсуляции маршрутов DnD API.
В группе Маршрутизаторы создайте новый файл с именем DndRouter.swift. Затем добавьте в файл следующее:
Перечисление определяет два случая, каждый для определенного маршрута:
1. monsters
получает список монстров.
2. equipment(name:)
ищет оборудование по названию.
Укажите пути URL-адресов для каждого случая, добавив следующее в DnDRouter
:
Вот разбивка кода:
1.baseURL
определяет начальную конечную точку DnD API.
2. path
определяет компоненты пути для каждого маршрута.
Приведенный выше код предоставляет маршрутизатору информацию о его конечной точке, но в каждом случае отсутствует метод HTTP.
Затем добавьте import Alamofire
в начало DndRouter.swift. Затем добавьте в DnDRouter
следующее:
Поскольку оба маршрута запрашивают данные, вы можете использовать оператор переключения на случай падения. В обоих случаях в качестве типа запроса будет возвращен Alamofire HTTPMethod.get
. Теперь добавьте параметры маршрута в DnDRouter
:
Маршрут монстров не имеет параметров, что означает, что API не требует их. Однако для оборудования необходим словарь с парой ключ-значение, как указано в документации DnD API.
Теперь у маршрутизатора есть все его компоненты, вы можете определять его маршруты »URLRequest
.
Добавьте следующее расширение внизу DndRouter.swift:
Приведенный выше код создает URLRequest
следующим образом:
- Он согласовывает маршрутизатор с
URLRequestConvertible
и реализует требуемый методasURLRequest()
. - Затем он создает маршрут
URL
, добавляяbaseURL
с компонентом маршрутаpath
. - Он определяет экземпляр
URLRequest
, используя маршрутURL
. - Затем он назначает свойство
URLRequest.method
маршрутуmethod
. - Затем он кодирует и встраивает маршрут
parameters
в экземплярURLRequest
.URLEncodedFormParameterEncoder
кодирует переданные параметры в строку в кодировке URL. - Наконец, он возвращает закодированный
URLRequest
.
Теперь DndRouter
маршруты готовы к присоединению к Request
.
Откройте MonstersTableViewController.swift. Замените следующий код в fetchMonsters()
:
С участием:
Затем в searchEquipment(with:)
замените:
С участием:
DnDRouter
обеспечивает разделение задач в вашем сетевом стеке.
Вот диаграмма, иллюстрирующая шаблон DnDRouter
.
Он показывает, как DnDRoute
строит маршруты для монстров и оборудования, которые будут прикреплены к Request
для направления в сеть.
Кодировка параметров
Alamofire поддерживает любые Encodable
в качестве параметров запроса.
Он предоставляет два ParameterEncoder
соответствующих типа:
- URLEncodedFormParameterEncoder: кодирует значения в строку в кодировке url. Его
destination
решает, где установить этот результат кодирования:
*queryString
: запросURL
запроса.
*httpBody
: HTTP-телоURLRequest
.
*methodDependent
: он используетqueryString
дляGET
,HEAD
иDELETE
, ноhttpBody
для других. - JSONParameterEncoder: кодирует
Encodable
значения с помощьюJSONEncoder
Swift. Он устанавливает результат в HTTP-текстеURLRequest
.
Оба типа устанавливают параметр заголовка URLRequest
Content-Type
, если он еще не установлен.
Создание маршрутизатора изображений
Инкапсулируйте маршруты API изображений в отдельном маршрутизаторе.
Теперь создайте новый маршрутизатор для хранения маршрута поиска изображений.
В группе Маршрутизаторы создайте новый файл Swift с именем ImagesRouter.swift. Затем добавьте в файл следующее:
ImagesRouter
определяет images(query:)
маршрут для поиска изображений с использованием значения запроса.
Затем определите URL-адрес пути. Добавьте в ImagesRouter
следующее:
Это GET
метод. Добавьте следующее:
Затем определите параметры API. Добавьте следующее:
Как и для DNDRouter
, добавьте внизу следующее расширение:
Наконец, прикрепите к запросу images(query:)
маршрут.
Откройте ImagesCollectionViewController.swift, замените fetchImages()
:
С участием:
Примечание. Ключевое слово Драконы увеличивает вероятность получения результата поиска.
Строй и беги. Вы не увидите различий. :]
Сериализация ответов
Прежде чем исправить ошибку ответа на экране изображений, вам необходимо проанализировать и преобразовать ее в подходящий формат. Это миссия сериализатора ответов.
К счастью, Alamofire предлагает три ResponseSerializer
соответствующих типа:
- DataResponseSerializer: полезно для настраиваемой обработки данных. Он используется в
responseData(queue:completionHandler)
. - StringResponseSerializer: использует
String.Encoding
для анализа данных наString
.responseString(queue:encoding:completionHandler:)
использует это. - DecodableResponseSerializer: анализирует данные по определенным
Decodable
типам. Это сериализатор дляresponseDecodable(of:queue:decoder:completionHandler:)
.
Вот диаграмма, на которой показаны различные компоненты, работающие вместе:
После направления запроса на сервер обработчики ответа получают и сериализуют данные ответа.
Создание сериализатора ответа на ошибку
У Imgur API есть два возможных ответа: Успешно и Ошибка, каждый с другой моделью.
Выбрав fetchImages()
из ImagesCollectionViewController
, вы найдете:
1. Успешный ответ: responseDecodable(of: Images.self)
сериализует его. Кроме того, он устанавливает case let .failure(error)
для отображения предупреждения в случае сбоя.
2. Ответ об ошибке: нет обработчика, который бы рассматривал его сериализацию.
Вот ответ с ошибкой:
Примечание. стартовый проект предоставляет:
- ImagesErrorResponse: декодируемый
struct
для сопоставления приведенного выше ответа об ошибке. - ResponseError:
enum
, который соответствуетError
протоколу Swift и представляет вашу пользовательскую ошибку.
Это хороший шанс создать свой ResponseSerializer
для обработки ошибок. Помимо ответа об ошибке API, вы также обрабатываете ошибки подключения.
В группе Сериализаторы создайте новый файл Swift с именем ErrorResponseSerializer.swift. Затем добавьте в начало этого файла следующее:
Приведенный выше код создает ErrorResponseSerializer
, который соответствует ResponseSerializer
, и реализует его serialize(request:response:data:error:)
. Затем он возвращает ResponseError
в качестве своего универсального типа.
Для обработки ошибок подключения добавьте следующее в начале serialize(request:response:data:error:)
:
Это защитное заявление защищает от вероятности невозможности возврата данных из-за ошибок подключения к Интернету или тайм-аута.
Сериализаторы Alamofire уже делают большую часть тяжелой работы. Сейчас хорошее время, чтобы попросить их о помощи в сериализации ответа об ошибке API.
Добавьте в конец serialize(request:response:data:error:)
следующее:
Код выше:
- Использует
DecodableResponseSerializer
Alamofire для анализа ответа с помощьюImagesErrorResponse
. Помните, что передайтеnil
вместоerror
вserialize(request:response:data:error:
, иначе будет выдана ошибка без попытки декодирования ответа. - Проверяет и возвращает соответствующий
ResponseError
, либо ошибку аутентификации, либо ошибку сервера.
Примечание: начальный проект определяет Int
расширение с isAuthenticationErrorCode()
для сопоставления кодов ответа аутентификации 401 и 403.
Теперь ErrorResponseSerializer
готов к присоединению к циклу Request
и сериализации таких ответов.
Откройте ImagesCollectionViewController.swift и добавьте следующее в конец запроса Alamofire в fetchImages()
:
Этот код добавляет дополнительный обработчик ответа к экземпляру Request
. Если это произойдет, он обработает ответ об ошибке.
Примечание: showError(_:)
определяется в нижней части ImagesCollectionViewController
. Он показывает подходящий AlertViewController
, соответствующий типу ResponseError
.
Перед запуском удалите слепую обработку отказов в .responseDecodable(of: Images.self)
. Заменять:
С участием:
Выполните сборку и запустите, чтобы увидеть, как работает обработка ошибок.
Затем отключите подключение к Интернету и выберите любого монстра, чтобы проверить, как обрабатываются ошибки подключения.
Понимание аутентификации API
Обеспечение безопасности своих данных - главная забота поставщиков данных. Тремя основными методами повышения безопасности API являются базовая аутентификация HTTP, ключи API и OAuth.
Imgur использует OAuth 2.0. По сути, это более безопасный вариант аутентификации и авторизации.
На рисунке выше показаны основные этапы OAuth 2.0. Чтобы глубже погрузиться в эти этапы, приведенная ниже диаграмма дает вам четкое представление о том, что ждет вас при аутентификации с помощью Imgur API:
Клиент делает запрос авторизации для токена доступа и токена обновления. Используя токен доступа, клиент может либо получать ресурсы с сервера ресурсов с действующим токеном. В случае неверного токена доступа сервер ресурсов возвращает ошибку. В этом случае клиент будет использовать токен обновления для получения новых токенов доступа и обновления.
Примечание. Для получения дополнительной информации о OAuth 2.0 ознакомьтесь с OAuth 2.0 с Swift.
Регистрация приложения с помощью Imgur
Каждая служба OAuth 2.0 требует, чтобы вы в какой-то момент зарегистрировали свое приложение. Откройте Imgur Registration, чтобы зарегистрировать аккаунт. Затем щелкните здесь, чтобы зарегистрировать приложение на портале разработчика.
Используйте следующую информацию для регистрации вашего приложения:
- Название приложения: DnDRealm.
- Тип авторизации: авторизация OAuth 2 с URL-адресом обратного вызова.
- URL обратного вызова авторизации: rwdnd: \.
Затем введите адрес электронной почты.
По завершении вы увидите следующий экран:
Скопируйте свой идентификатор клиента и секрет клиента в Authentication / AuthenticationKeys.swift следующим образом:
Прохладный. :] Вы готовы начать цикл авторизации.
Авторизация пользователя
Авторизация URL
позволяет пользователю входить в систему и давать разрешения зарегистрированному приложению. Определите его согласно документации Imgur API.
Теперь откройте ImagesRouter.swift и добавьте ниже baseURL
следующее:
Затем откройте ImagesCollectionViewController.swift. ВpresentAuthenticationAlert(with:)
добавьте следующий код под // TODO: Login Action
:
Браузер откроется с authorizationURL
, когда пользователь нажмет кнопку входа в предупреждении.
Строй и беги. Нажмите на ячейку представления таблицы. Появляется предупреждение. Нажмите кнопку войти. Появится следующее:
Приложение перенаправляет вас на страницу аутентификации Imgur. Войдите в свою учетную запись.
После успешного входа в систему появится уведомление с вопросом, хотите ли вы открыть приложение. Нажмите Открыть. :]
Вы выполнили первый шаг процесса аутентификации Imgur API! Стартовый проект обработал возвращенные токены и выполнил второй шаг за вас. :]
Примечание. стартовый проект предоставляет:
- Протокол TokenHandler: он извлекает токены доступа и обновления из URL-адреса обратного вызова. После этого он сохраняет их в Связке ключей.
- Протокол аутентификатора: он отвечает за получение и обновление токена доступа.
Примечание. Для получения дополнительной информации о работе с Связкой ключей ознакомьтесь с Руководством по API служб Связки ключей для паролей в Swift.
Работа с перехватчиком запросов
Протокол RequestInterceptor
Alamofire состоит из протоколов RequestAdapter
и RequestRetrier
. Они могут сыграть большую роль в цикле авторизации вашего приложения.
RequestAdapter
проверяет и изменяет каждый URLRequest
перед отправкой по сети. Следовательно, это подходящее место для вставки заголовка авторизации в URLRequest
. Вот диаграмма, показывающая, как он взаимодействует в Request
цикле.
При адаптации Успешно RequestAdapter
добавляет дополнительные URLRequest
и URLSessionTask
к свойствам requests
и tasks
запроса.
Добавление заголовка авторизации
Заголовок запроса авторизации содержит учетные данные для аутентификации пользователя на сервере. Итак, здесь вы добавите токен доступа при адаптации запроса.
В группе Перехватчики создайте новый файл Swift с именем ImagesRequestInterceptor.swift.
Добавьте следующее:
Вот ты:
- Создайте свой
RequestInterceptor
класс, соответствующий: - * _ 119_ для реализацииRequestAdapter.adapt(_:for:completion:)
.RequestAdapter
выполняет этот метод перед отправкойURLRequest
на сервер.
*Authenticator
.protocol
, который предоставляет маркер доступа для аутентификации. - Затем определите новый экземпляр
URLRequest
, которым нужно управлять. - Проверьте, есть ли внутри приложения
accessToken
, если пользователь ранее успешно входил в систему. - Затем добавьте
accessToken
в заголовок авторизацииURLRequest
, используяHTTPHeader.authorization(bearerToken:)
. - Затем отправьте модифицированный
URLRequest
по сети. - Если нет
accessToken
, прервитеRequest
с ошибкойauthentication
.
Примечание. HTTPHeader
Alamofire предоставляет типы авторизации, соответствующие следующим подходам аутентификации:
- Базовая аутентификация HTTP:
.authorization(username:password:)
- Ключи API:
.authorization(_:)
- Токен OAuth:
.authorization(bearerToken:)
Угадайте, какой компонент обрабатывает authentication
ошибку, появившуюся на шестом шаге приведенного выше кода? Правильно, это ваш ErrorResponseSerializer
обработчик!
Обработка ошибки адаптации
Ошибка адаптации заключается в том, что ошибка возникает во время выполнения adapt(_:for:completion:)
. Теперь вы справитесь с этой ошибкой.
Откройте ErrorResponseSerializer.swift, добавьте следующий код в начало serialize(request:response:data:error:)
:
Приведенный выше код проверяет и возвращает ошибку адаптации.
Наконец, введите ImagesRequestInterceptor
в Request
цикл выполнения.
Откройте ImagesCollectionViewController.swift и замените внутри fetchImages()
следующее:
С участием:
Строй и беги. Вам нужно будет выполнить третий и четвертый этапы цикла авторизации.
Запрос роли ретриера
RequestRetrier
протокол может повторить запрос, обнаруживший ошибку. Следовательно, это подходящее место для обновления токена доступа в случае его недействительности.
Ниже приведена диаграмма, показывающая поток взаимодействия RequestRetrier
:
При повторной попытке запроса к его свойству requests
добавляется новый URLRequest
.
RequestRetrier
срабатывает при возможном наборе ошибок:
URLRequestConvertible
при вызове возвращает ошибку.RequestAdapter
не работает во время адаптации.URLSessionTask
завершается с ошибками по разным причинам, например, из-за доступности сети или отмены.- Обработчики ответов выдают ошибку из-за недопустимого ответа или синтаксического анализа.
Примечание. RequestRetrier
также может вызывать ошибки, которые не вызывают действия повтора.
Обновление токена доступа
Когда срок действия токена доступа истекает или он становится недействительным, пора для токена обновления получить новый. Жетоны обновления несут информацию, необходимую для получения нового токена доступа без запроса пользователя.
Теперь вы реализуете свой RequestRetrier
для обновления токена доступа.
Откройте ImagesRequestInterceptor.swift и добавьте в ImagesRequestInterceptor
следующее:
Разбив это, вы получите следующее:
RequestRetrier
выполняетсяretry(_:for:dueTo:completion:)
при возникновении ошибок.guard
предотвращаетRequest
повторную попытку, если он не обходит следующие условия:
*lastProceededResponse != request.response
: предотвращает многократное выполнение тела для одного и того же экземпляра ответа. ПримечаниеRequestRetrier
может выполняться много раз для одного и того же ответа. Например, для одного и того же ответа возникает ошибка ответа аутентификации и ошибка сериализации. В результате Alamofire запускает своиRequestRetrier
дважды, по одной на ошибку.
*request.retryCount < retryLimit
: ограничивает максимальное количествоRequest
повторных попыток.
*let statusCode = request.response?.statusCode
иstatusCode.isAuthenticationErrorCode()
: убедитесь, что это ошибка аутентификации.- Он сохраняет ссылку на последний обработанный ответ, поскольку
guard
выше его проверяет. - Ошибка аутентификации. Поэтому он вызывает
Authenticator.refreshToken(completion:)
, что обеспечивает следующее:
* ОтправляетRequest
для обновления недопустимого токена доступа.
* Сохраняет новый токен доступа, чтобы он был готов к использованию. - В результате обновления процесса токена доступа он принимает решение либо
RetryResult.retry
, либоRetryResult.doNotRetry
.
Вот диаграмма, иллюстрирующая возможные значения RetryResult
.
Примечание. Alamofire включает встроенный перехватчик RetryPolicy
. Это позволяет легко повторить попытку при сбое запроса из-за множества распространенных сетевых ошибок.
Наконец, чтобы убедиться, что все подходят друг другу, переместите информацию запроса refreshToken с Authenticator.refreshToken(completion:)
на ImagesRouter
.
Откройте ImagesRouter.swift, добавьте в ImagesRouter
следующий регистр:
Затем определите его path
. Добавьте следующий код в path
:
Он публикует данные, поэтому добавьте в method
следующее:
Затем постройте его parameters
следующим образом:
Наконец, откройте Authenticator.swift и замените следующий код:
С участием:
Молодец! Вы завершили цикл авторизации.
Строй и беги.
Понимание типов запросов
Request
Alamofire имеет разные типы для разных целей. Каждый тип инкапсулирован определенным классом с уникальными свойствами и функциями, как показано ниже:
Request
Alamofire имеет три подкласса выборки данных: DataRequest
накапливает данные ответа в памяти, DataStreamRequest
передает данные в потоке, но не накапливает их, а DownloadRequest
загружает данные на диск. Кроме того, UploadRequest
является подклассом DataRequest
для загрузки данных, файлов или InputStream
на сервер.
Эти подклассы действуют как оболочка для URLSessionTask
. Каждый Request
хранит копию URLRequests
и URLSessionTasks
, которая включает в себя как инициалы, созданные из параметров, так и созданные RequestInterceptor
.
Примечание. Дополнительные сведения о
URLSessionTask
и его типах см. в Документации Apple.
Потоковая передача изображений с помощью DataStreamRequest
DataStreamRequest
от Alamofire подходит для длительных подключений к серверу, которые получают данные с течением времени. Он никогда не накапливает данные в памяти и не сохраняет их на диск. Вы собираетесь использовать его для потоковой передачи изображений.
Теперь проверьте ImagesCollectionViewController.fetchImages()
, вы обнаружите, что ответ сохраняется в items: [GalleryItem]
.
Этот GalleryItem
представляет изображение, поэтому преобразование его в самозагружаемый ресурс позволяет Alamofire прикреплять его к Request
напрямую как URL
.
Затем откройте GalleryItem.swift и добавьте следующее расширение после // MARK:- Alamofire URLConvertible
:
Приведенный выше код определяет GalleryItem
URL в соответствии с URLConvertible
, как описано в разделе Общие сведения о запросах маршрутизации. Проще говоря, это возвращает GalleryItem.url
для URLConvertible.asURL()
.
Теперь items
готов к потоковой передаче.
Откройте ImagesCollectionViewController.swift и добавьте в streamImages()
следующее:
Код выше:
- Инициализирует
DataStreamRequest
для каждогоGalleryItem
вitems
. - Затем он проверяет ответ так:
*HTTPURLResponse.statusCode
находится в диапазоне200..<300
.
* ЗаголовокContent-Type
соответствует значениюAccept
запроса. - Затем он добавляет обработчик
responseStream(on:stream:)
, который повторно вызывается по мере поступления данных. - Затем для правильных ответов с данными он вызывает
GalleryItem.appendData(_:)
, что обеспечивает следующее:
* Добавляет данные в каждый экземплярGalleryItem
.
* Затем запускает закрытиеGalleryItem.responseStream
. Это позволяет любому экземпляру прослушивать этот поток данных.
ОтметьтеImageCollectionViewCell.monitorDataStream(for:)
, который прослушивает и отображает этот поток.
Строй и беги. Изображения загружаются. :]
Поскольку изображения выбираются случайным образом, одно и то же изображение может быть выбрано много раз. Что, если то же изображение будет получено снова? Будет ли он стрим снова ?!
Да, это будет. Однако CachedResponseHandler
Alamofire может помочь вам.
Кеширование изображений
Кэширование ответов оказывает большое влияние на производительность приложений. Он эффективно сохраняет и повторно использует ранее полученные ответы для обслуживания их будущих запросов.
Alamofire предоставляет ResponseCacher
, который соответствует CachedResponseHandler
. Это упрощает управление поведением кеширования.
Чтобы избежать многократной потоковой передачи изображения, кешируйте его потоковый ответ.
Теперь откройте ImagesCollectionViewController.swift. Внутри streamImages()
добавьте следующее прямо под .validate()
:
Этот однострочный код кэширует изображения, добавляя Request.cacheResponse(using:)
к Behavior.cache
.
Вот возможные Behavior
значения:
cache
сохраняет ответ.modify(_:)
изменяет ответ перед его сохранением.doNotCache
предотвращает сохранение ответа.
Примечание: информацию о правилах кеширования см. в Документации Apple.
Сборка и запуск для одноразовой потоковой передачи.
Загрузка изображений с помощью UploadRequest
Вы заинтересованы в добавлении изображений в свой профиль Imgur? Вы уже добавили все данные потоковой передачи GalleryItem
, а это значит, что вы готовы их загрузить.
Теперь вы определите маршрут загрузки.
Откройте ImagesRouter.swift. Добавьте в ImagesRouter
следующий регистр:
Затем добавьте в path
следующее:
Добавьте в method
следующее:
Наконец, добавьте в parameters
следующее:
Теперь определите метод загрузки GalleryItem
с использованием этого маршрута.
Откройте ImagesCollectionViewController.swift. Добавьте следующее расширение после // MARK: — Alamofire UploadRequest
:
В приведенном выше коде определяется upload(_:at:)
для загрузки GalleryItem
.
Вот разбивка:
- Создает экземпляр
UploadRequest
для загрузкиGalleryItem.data
вImagesRouter.upload
маршрут. - Слушает ошибки, используя
ErrorResponseSerializer
. - В случае ошибки и перед ее отображением убедитесь, что
GalleryItem
больше не загружается, установив дляuploadRequest
значениеnil
. - Перезагружает соответствующую ячейку, чтобы отразить изменения состояния запроса.
- Устанавливает
GalleryItem.uploadRequest
наuploadRequest
. Это указывает на запущенныйUploadRequest
для этогоGalleryItem
.
Затем вы загрузите конкретный GalleryItem
, когда пользователь нажмет ImageCollectionViewCell
.
Итак, добавьте в ImagesCollectionViewController
внутри collectionView(_:didSelectItemAt:)
следующее:
Приведенный выше код вызывает upload(_:at:)
для выбранных GalleryItem
и IndexPath
, если для этого GalleryItem
еще не запущен UploadRequest
.
Перед запуском вам необходимо отобразить свойства состояние и прогресс этого UploadRequest
.
Отражение состояния запроса на загрузку
Изучите различные Request
состояния, прежде чем углубляться в код:
Request
запускается в состоянии Инициализировано. Его можно Приостановить, Возобновить или Отменить, вызвав соответствующий метод. Например, resume()
возобновляет или запускает Request
, а suspend()
приостанавливает или приостанавливает выполнение запроса.
Возобновленный Request
переходит в состояние Готово после того, как будут запущены все валидаторы и сериализаторы ответа. Однако, если после этого к этому Request
будут добавлены дополнительные сериализаторы ответа. Он вернется в состояние Возобновлено и снова выполнит сетевой запрос.
Примечание. Если startRequestsImmediately
истинно, Alamofire вызывает resume()
после добавления обработчика ответа в Request
.
Теперь вы готовы нанести на карту эти разные состояния.
Откройте ImageCollectionViewCell.swift и добавьте следующий код в расширение под // MARK: — UploadRequest
:
Этот метод отражает UploadRequest
состояния ячейки state
.
Затем следите за ходом запроса на загрузку. Добавьте следующий метод ниже updateCellState(with:)
:
Код выше:
- Устанавливает текущий прогресс
uploadRequest
в ячейкуprogressBar
. - Добавляет
uploadProgress(queue:closure:)
обработчик вuploadRequest
для отслеживания прогресса. Он периодически вызываетclosure
сprogress
отправленных данных на сервер.
Наконец, объедините эти два метода для настройки ячейки.
Добавьте в configureWithUploadRequest(_:)
следующее:
Все готово. Строй и беги. Нажмите на изображение.
Ой! Вы не добавляли ImagesRequestInterceptor
в UploadRequest
.
Перед добавлением у Session
есть еще одно предложение!
Создание сеанса изображений
Session
Alamofire предоставляет API для различных Request
подклассов. Кроме того, он инкапсулирует различные конфигурации, применяемые к его запросам.
Session
предоставляет default
одноэлементный экземпляр, который используется пространством имен AF
. AF.request(“https://...")
эквивалентно Session.default.request(“https://...")
.
Все запросы Imgur требуют, чтобы вы вводили ImagesRequestInterceptor
в их цикл.
В группе Сеансы создайте новый файл Swift с именем ImagesSession.swift.
Добавьте в файл следующее:
Этот код создает экземпляр синглтона default
для ImagesSession
. Он настраивает Session
, назначая экземпляр ImagesRequestInterceptor
его перехватчику.
Примечание: дополнительные
Session
конфигурации см. в Документации Alamofire.
Теперь вернитесь к ImagesCollectionViewController.swift и примените следующие изменения:
- В
fetchImages()
заменитеAF.request
наImagesSession.default.request
. - В
upload(_:at:)
заменитеAF.upload
наImagesSession.default.upload
.
Строй и беги. Загрузите изображение. Проверьте свой профиль Imgur.
Приостановка и возобновление запроса на загрузку
Управление состоянием загрузки - приятный подарок пользователю. :]
Пока вы все еще находитесь в ImagesCollectionViewController.swift, добавьте следующий код под // MARK: — Alamofire Request
:
Он добавляет suspendOrResume()
для переключения состояния Request
между suspended
и resumed
.
Чтобы приостановить и возобновить загрузку, когда пользователь нажимает ImageCollectionViewCell
, добавьте следующий код ниже // TODO: Suspend or resume request
:
Это меняет состояние UploadRequest
для уже загруженной ячейки.
Строй и беги.
Прослушивание на предмет доступности Интернета
Прослушивание статуса доступности сети полезно. Однако не используйте его, чтобы определять, следует ли отправлять сетевой запрос.
Alamofire предоставляет NetworkReachabilityManager
для таких сценариев. Он отслеживает изменения доступности хостов и адресов.
Теперь вы узнаете, как его использовать и отображать статус доступности.
Откройте MonstersTableViewController.swift. Добавьте в MonstersTableViewController
следующее свойство:
Затем добавьте следующее расширение под // MARK: — Network Reachability
:
Вот код:
1. Инициализирует MonstersTableViewController.reachabilityManager
хостом Apple. Вы можете передать любой доверенный действующий хост для прослушивания.
2. Затем он вызывает startListening(onQueue:onUpdatePerforming:)
, чтобы начать отслеживать изменения статуса доступности сети.
3. Затем он отображает статус доступности в приглашении UINavigationBar
. < br /> 4. Первый fetchMonsters()
вызов в viewDidLoad()
может завершиться неудачно по любой причине. Вот подходящее место для получения данных, когда статус становится reachable
.
Наконец, добавьте listenToReachability()
в конец viewDidLoad()
, чтобы начать прослушивание.
Примечание. Лучше использовать устройство iOS, а не симулятор. При запуске в симуляторе и выключении, а затем повторном включении WiFi, API-интерфейсы достижимости не сообщают, что соединение было восстановлено из-за поведения симулятора во время выполнения.
Строй и беги. Отключите подключение к Интернету, чтобы увидеть изменения статуса.
Заключение
Вы можете скачать финальный проект из репозитория ниже. В этом руководстве вы изучили продвинутые методы Alamofire для работы с различными аспектами, такими как маршрутизация и цикл аутентификации. Вы также узнали об использовании различных типов запросов.
Чтобы узнать больше о деталях, скрытых за кулисами, ознакомьтесь с Руководством по началу работы с URLSession. Это отличная отправная точка для запросов URLSession. Если у вас есть какие-либо вопросы или комментарии к этому руководству, присоединяйтесь к обсуждению ниже!
Сознавать
Особая благодарность raywenderlich.com за руководство и руководство.