Какви са разликите между използването на async/await и обработчиците за завършване при работа с асинхронен код?
sobes.tech AI
Отговор от AI
Основните разлики между async/await и обработчиците за завършване при работа с асинхронен код в iOS:
-
Синтаксис и четимост: async/await позволява писане на асинхронен код в последователен стил, което подобрява четимостта и улеснява отстраняването на грешки. Обработчиците за завършване използват вложени затваряния, което може да доведе до "адът на обратните повиквания".
-
Обработка на грешки: с async/await може да се използва обичайният механизъм try/catch за обработка на грешки, докато при обработчиците за завършване грешките обикновено се предават чрез параметри, което изисква допълнителна проверка.
-
Съвместимост: async/await се поддържа в Swift от версия 5.5 и iOS 15, докато обработчиците за завършване работят във всички версии.
Пример с async/await:
func fetchData() async throws -> Data {
let url = URL(string: "https://example.com/data")!
let (data, _) = try await URLSession.shared.data(from: url)
return data
}
Task {
do {
let data = try await fetchData()
print("Данните получени: \(data)")
} catch {
print("Грешка: \(error)")
}
}
Пример с обработчик за завършване:
func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
let url = URL(string: "https://example.com/data")!
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(error))
return
}
if let data = data {
completion(.success(data))
}
}.resume()
}
fetchData { result in
switch result {
case .success(let data):
print("Данните получени: \(data)")
case .failure(let error):
print("Грешка: \(error)")
}
}
По този начин async/await опростява работата с асинхронен код, правейки го по-разбираем и удобен.