Рекомендации по использованию Async/Await в разработке для iOS
27 февраля 2024 г.Асинхронное программирование стало краеугольным камнем современной разработки приложений. В экосистеме iOS компания Apple представила встроенную поддержку асинхронного программирования с помощью Swift, включая мощный шаблон async/await. В этой статье мы углубимся в использование async/await в разработке для iOS.
Понимание async/await
Async/await — это парадигма программирования, которая упрощает выполнение асинхронного кода, делая его более синхронным и читабельным. Это устраняет сложности управления обратными вызовами или обработчиками завершения, позволяя разработчикам писать асинхронный код так же, как и синхронный код. Благодаря async/await в Swift разработчики могут эффективно обрабатывать такие задачи, как сетевые запросы, запросы к базе данных или файловый ввод-вывод, не блокируя основной поток.
Основное использование async/await в iOS:
- Определение асинхронной функции. Чтобы создать асинхронную функцию, просто используйте ключевое слово
async
в объявлении функции. Это означает, что функция будет выполнять асинхронные задачи.
ол> - Вызов асинхронной функции в синхронном коде. Используйте структуру
Task
, чтобы обозначить область асинхронного вызова в синхронном коде.
ол>
<код>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 в // Обновляем пользовательский интерфейс
Расширенные варианты использования:
<код>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.
Оригинал