Рекомендации по использованию Async/Await в разработке для iOS

Рекомендации по использованию Async/Await в разработке для iOS

27 февраля 2024 г.

Асинхронное программирование стало краеугольным камнем современной разработки приложений. В экосистеме iOS компания Apple представила встроенную поддержку асинхронного программирования с помощью Swift, включая мощный шаблон async/await. В этой статье мы углубимся в использование async/await в разработке для iOS.

Понимание async/await

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

Основное использование async/await в iOS:

  1. Определение асинхронной функции. Чтобы создать асинхронную функцию, просто используйте ключевое слово async в объявлении функции. Это означает, что функция будет выполнять асинхронные задачи.
  2. <код>csharp func fetchData() асинхронно -> Данные { // асинхронные операции

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

    <код>csharp func fetchImageData() асинхронно -> Данные { let url = URL(строка: «https://example.com/image.jpg»)! делать { let (data, _) = попробуйте дождаться URLSession.shared.data(from: url) возвращать данные } ловить { // Обработка ошибок }

    3. Отметить вызывающую функцию как асинхронную. При вызове асинхронной функции из другой функции также отметьте вызывающую функцию как асинхронную. Это облегчает использование await для вызова асинхронных функций.

    <код>csharp func displayImage() асинхронный { пусть imageData = ждет fetchImageData() пусть изображение = UIImage (данные: imageData) // Обновляем пользовательский интерфейс с изображением

    4. Обработка ошибок. Обработка ошибок с помощью async/await проста. Используйте блоки try и catch для обработки ошибок, возникающих в асинхронных функциях.

    ```csharp func fetchImageDataWithThrowing(stringURL: URL) асинхронные броски -> Данные { Guard let URL = URL (строка: stringURL) else { throw NSError(domain: «Неверный URL», код: 0)

       let (data, _) = try await URLSession.shared.data(from: url)
       return data
    

    func displayData() async { пусть URL = "https://example.com/image.jpg" делать { let data = попробуйте дождаться fetchImageDataWithThrowing (stringURL: url) // Данные обработки } ловить { // Обработка ошибок } } ```

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

    <код>csharp Задача { ожидайте MainActor.run { // Обновляем пользовательский интерфейс }

    или

    <код>csharp Задача { @MainActor в // Обновляем пользовательский интерфейс

    Расширенные варианты использования:

    1. Вызов асинхронной функции в синхронном коде. Используйте структуру Task, чтобы обозначить область асинхронного вызова в синхронном коде.
    2. <код>csharp функция upadeImg() { Задача { пусть изображение = ждет fetchImageData() MainActor.run { // Обновляем пользовательский интерфейс } }

      2. Преобразование функции с обратным вызовом в асинхронную. Чтобы создать асинхронную функцию, просто используйте конструкцию типа withCheckedContinuation или withCheckedThrowingContinuation. Это может помочь вам, если вы хотите использовать async/await на сетевом уровне в iOS до версии 15 и после 13.

      <код>csharp расширение URLSession { func asyncDataRequest(url: URL) асинхронные броски -> Данные { попробуйте подождать сCheckedThrowingContinuation {следующий в dataTask(with: url,completeHandler: {данные, ответ, ошибка в если пусть ошибка { next.resume(выдает: ошибка) } иначе, если пусть данные { next.resume(возвращение: данные) } еще { next.resume(выдает: NSError(домен: «Пустые данные», код: 0)) } }).резюме() } }

      3. Параллельное выполнение нескольких запросов. Используйте такие конструкции, как async let или withTaskGroup или withThrowingTaskGroup, для выполнения нескольких асинхронных методов. одновременно сокращая количество строк кода и повышая эффективность.

      ```csharp func fetchUser() async -> Пользователь { асинхронный let imageData = ожидание fetchImageData() async let fullName = await fetchUserFullName()

         return await User(avatar: imageData, fullName: fullName)
      

      } ```

      или withTaskGroup

      ```csharp func fetchImages(imageID: [String]) async ->gt; [Данные] { await withTaskGroup(of: Data.self) { группа в imageID.forEach { идентификатор в группа.addTask { ждут fetchImageData (поID: id) }

             return await group.reduce(into: [Data]()) { tmpResult, imageData in
                 tmpResult.append(imageData)
             }
         }
      

      } ```

      Заключение

      Async/await в Swift представляет собой мощный и понятный подход к асинхронному программированию в приложениях iOS. Следуя описанным шагам, разработчики могут упростить свой асинхронный код, улучшить скорость реагирования приложений и использовать надежные возможности асинхронного программирования Swift для создания более эффективных и отзывчивых приложений для iOS.


      Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE