Koje su razlike između korišćenja async/await i handlera za završetak prilikom rada sa asinhronim kodom?
sobes.tech АИ
Одговор од АИ
Основне разлике између 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 поједностављује рад са асинхроним кодом, чинећи га разумљивијим и погоднијим.