Преобразование legacy callback-based API в современный async/await в Swift осуществляется с помощью встроенных механизмов continuations.
withCheckedContinuation — для API, которые не могут выбрасывать ошибкиwithCheckedThrowingContinuation — для API, которые могут выбрасывать ошибкиОберни legacy API внутри closure с continuation. Когда callback выполнится, возобнови continuation с результатом или ошибкой. После этого structured concurrency Swift возьмет всё под контроль.
func fetchData() async throws -> Data {
try await withCheckedThrowingContinuation { continuation in
legacyAPI.fetchData { data, error in
if let error = error {
continuation.resume(throwing: error)
} else if let data = data {
continuation.resume(returning: data)
}
}
}
}
withCheckedContinuation во время разработки; он добавляет предупреждения в рантайме при нарушении правилаwithUnsafeContinuation, но он пропускает проверки безопасностиЭтот паттерн — стандартный мост между старым callback-based кодом и современной Swift concurrency, позволяющий использовать legacy API чистым способом с async/await без переписывания базовой реализации.
Функция withCheckedContinuation предназначена для обёртывания API на основе callback-ов, которые не выбрасывают ошибки, а withCheckedThrowingContinuation используется, когда API может выбросить ошибку.
Новый — ещё не проверен сообществом
Вы