Введение в запуск асинхронного кода

Асинхронный код выполняет несколько операций одновременно. Параллелизм необходим при выполнении тяжелых вычислений или сетевых запросов. Однако это может увеличить сложность кода. Цель использования async await — взять под контроль параллелизм, не создавая беспорядка в коде.

Асинхронные функции

До появления async await мы обрабатывали асинхронные функции, используя обратные вызовы завершения. Возьмем в качестве примера следующее действие:

  1. Выбрать ближайший город
  2. Получить прогноз погоды для ближайшего города

Завершения должны вызываться одно за другим. Мы не можем выполнить шаг 2 перед шагом 1, потому что для получения погоды для города требуется название города из завершения 1-го запроса. Цепочка завершений запросов может привести к аду обратных вызовов в нашем коде. Давайте посмотрим на функции fetchClosestCity и fetchWeather. Каждый из них возвращает завершение с результатом, который необходимо обработать.

Вложенная операция получения погоды для ближайшего города вызывает путаницу в нашем коде.

Как решить проблему с callback hell?

Здесь async await приходит на помощь. Он выводит результаты без обратных вызовов. Давайте посмотрим, как мы можем реорганизовать функции fetchClosestCity и fetchWeather, используя асинхронное ожидание.

Асинхронный

async сообщает компилятору, что функция асинхронная. Код в функции можно приостановить и возобновить в любое время.

Чтобы использовать async, добавьте его перед стрелкой ->. Если функция выдает ошибку, используйте throws после async. Давайте посмотрим, как асинхронность реализована в fetchClosestCity и fetchWeather.

Честно говоря, синтаксис не сильно отличается. Единственными изменениями являются удаление completion: @escaping (Result<String>, Error>) -> Void из входных параметров и добавление throws.

Ждите

await говорит программе подождать, пока функция async не будет выполнена. Это меняет структуру нашего кода, потому что не вызывает вложенности. Более того, обработка ошибок стала намного проще.

Программа ожидает результата fetchUsernames() и продолжает работу, если он предоставлен. Затем переменная city передается следующей функции.

await меняет правила игры. Из-за этого код более читабелен.

Параллельные асинхронные операции

Вызов функции await приостанавливает выполнение кода до его завершения. Иногда вам нужно запустить несколько асинхронных операций одновременно и дождаться их завершения. К счастью, выполнять такие задачи с помощью async await очень легко.

Для параллельного запуска функций используйте async перед объявлением переменной.
В этом примере результатом является arrayстрок или error.

Заключение

В заключение, async await — это мощный инструмент для управления параллелизмом в Swift. Это помогает упростить код, сделать его более читаемым и легче обрабатывать ошибки. Независимо от того, запускаете ли вы несколько асинхронных функций параллельно или ожидаете результата асинхронной функции, асинхронное ожидание поможет вам.