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 следующим образом:

  1. Он согласовывает маршрутизатор с URLRequestConvertible и реализует требуемый метод asURLRequest().
  2. Затем он создает маршрут URL, добавляя baseURL с компонентом маршрута path.
  3. Он определяет экземпляр URLRequest, используя маршрут URL.
  4. Затем он назначает свойство URLRequest.method маршруту method.
  5. Затем он кодирует и встраивает маршрут parameters в экземпляр URLRequest. URLEncodedFormParameterEncoder кодирует переданные параметры в строку в кодировке URL.
  6. Наконец, он возвращает закодированный 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:) следующее:

Код выше:

  1. Использует DecodableResponseSerializer Alamofire для анализа ответа с помощью ImagesErrorResponse. Помните, что передайте nil вместо error в serialize(request:response:data:error:, иначе будет выдана ошибка без попытки декодирования ответа.
  2. Проверяет и возвращает соответствующий 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.

Добавьте следующее:

Вот ты:

  1. Создайте свой RequestInterceptor класс, соответствующий: - * _ 119_ для реализации RequestAdapter.adapt(_:for:completion:). RequestAdapter выполняет этот метод перед отправкой URLRequest на сервер.
    * Authenticator. protocol, который предоставляет маркер доступа для аутентификации.
  2. Затем определите новый экземпляр URLRequest, которым нужно управлять.
  3. Проверьте, есть ли внутри приложения accessToken, если пользователь ранее успешно входил в систему.
  4. Затем добавьте accessToken в заголовок авторизации URLRequest, используя HTTPHeader.authorization(bearerToken:).
  5. Затем отправьте модифицированный URLRequest по сети.
  6. Если нет 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 срабатывает при возможном наборе ошибок:

  1. URLRequestConvertible при вызове возвращает ошибку.
  2. RequestAdapter не работает во время адаптации.
  3. URLSessionTask завершается с ошибками по разным причинам, например, из-за доступности сети или отмены.
  4. Обработчики ответов выдают ошибку из-за недопустимого ответа или синтаксического анализа.

Примечание. RequestRetrier также может вызывать ошибки, которые не вызывают действия повтора.

Обновление токена доступа

Когда срок действия токена доступа истекает или он становится недействительным, пора для токена обновления получить новый. Жетоны обновления несут информацию, необходимую для получения нового токена доступа без запроса пользователя.

Теперь вы реализуете свой RequestRetrier для обновления токена доступа.

Откройте ImagesRequestInterceptor.swift и добавьте в ImagesRequestInterceptor следующее:

Разбив это, вы получите следующее:

  1. RequestRetrier выполняется retry(_:for:dueTo:completion:) при возникновении ошибок.
  2. guard предотвращает Request повторную попытку, если он не обходит следующие условия:
    * lastProceededResponse != request.response: предотвращает многократное выполнение тела для одного и того же экземпляра ответа. Примечание RequestRetrier может выполняться много раз для одного и того же ответа. Например, для одного и того же ответа возникает ошибка ответа аутентификации и ошибка сериализации. В результате Alamofire запускает свои RequestRetrier дважды, по одной на ошибку.
    * request.retryCount < retryLimit: ограничивает максимальное количество Request повторных попыток.
    * let statusCode = request.response?.statusCode и statusCode.isAuthenticationErrorCode(): убедитесь, что это ошибка аутентификации.
  3. Он сохраняет ссылку на последний обработанный ответ, поскольку guard выше его проверяет.
  4. Ошибка аутентификации. Поэтому он вызывает Authenticator.refreshToken(completion:), что обеспечивает следующее:
    * Отправляет Request для обновления недопустимого токена доступа.
    * Сохраняет новый токен доступа, чтобы он был готов к использованию.
  5. В результате обновления процесса токена доступа он принимает решение либо 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() следующее:

Код выше:

  1. Инициализирует DataStreamRequest для каждого GalleryItem в items.
  2. Затем он проверяет ответ так:
    * HTTPURLResponse.statusCode находится в диапазоне 200..<300.
    * Заголовок Content-Type соответствует значению Accept запроса.
  3. Затем он добавляет обработчик responseStream(on:stream:), который повторно вызывается по мере поступления данных.
  4. Затем для правильных ответов с данными он вызывает 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.

Вот разбивка:

  1. Создает экземпляр UploadRequest для загрузки GalleryItem.data в ImagesRouter.upload маршрут.
  2. Слушает ошибки, используя ErrorResponseSerializer.
  3. В случае ошибки и перед ее отображением убедитесь, что GalleryItem больше не загружается, установив для uploadRequest значение nil.
  4. Перезагружает соответствующую ячейку, чтобы отразить изменения состояния запроса.
  5. Устанавливает 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:):

Код выше:

  1. Устанавливает текущий прогресс uploadRequest в ячейку progressBar.
  2. Добавляет 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 за руководство и руководство.