Kokios yra skirtumai tarp async/await ir completion handlers naudojimo dirbant su asinchroniniu kodu?
sobes.tech AI
Atsakymas iš AI
Pagrindiniai skirtumai tarp async/await ir completion handlers dirbant su asinchroniniu kodu iOS:
-
Sintaksė ir skaitomumas: async/await leidžia rašyti asinchroninį kodą sekvenciniu stiliumi, kas pagerina skaitomumą ir palengvina derinimą. Completion handlers naudoja įterptus užraktus, kas gali sukelti "callback hell".
-
Klaidų tvarkymas: su async/await galima naudoti įprastą try/catch mechanizmą klaidų tvarkymui, o completion handlers klaidos dažniausiai perduodamos per parametrus, kas reikalauja papildomos patikros.
-
Suderinamumas: async/await palaikomas Swift nuo versijos 5.5 ir iOS 15, o completion handlers veikia visuose versijose.
Pavyzdys su 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("Gauta duomenys: \(data)")
} catch {
print("Klaida: \(error)")
}
}
Pavyzdys su completion handler:
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("Gauti duomenys: \(data)")
case .failure(let error):
print("Klaida: \(error)")
}
}
Taigi, async/await supaprastina asinchroninio kodo darbą, daro jį aiškesnį ir patogesnį.