Aké sú rozdiely medzi používaním async/await a completion handlermi pri práci s asynchrónnym kódom?
sobes.tech AI
Odpoveď od AI
Hlavné rozdiely medzi async/await a spracovateľmi dokončenia pri práci s asynchrónnym kódom v iOS:
-
Syntax a čitateľnosť: async/await umožňuje písať asynchrónny kód v sekvenčnom štýle, čo zlepšuje čitateľnosť a uľahčuje ladenie. Spracovatelia dokončenia používajú vnorené uzávierky, čo môže viesť k "pekelu callbackov".
-
Spracovanie chýb: s async/await môžete použiť bežný mechanizmus try/catch na spracovanie chýb, zatiaľ čo v spracovateľoch dokončenia sa chyby zvyčajne prenášajú cez parametre, čo vyžaduje ďalšiu kontrolu.
-
Kompatibilita: async/await je podporované v Swift od verzie 5.5 a iOS 15, zatiaľ čo spracovatelia dokončenia fungujú vo všetkých verziách.
Príklad s 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("Dáta prijaté: \(data)")
} catch {
print("Chyba: \(error)")
}
}
Príklad s spracovateľom dokončenia:
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("Dáta prijaté: \(data)")
case .failure(let error):
print("Chyba: \(error)")
}
}
Týmto spôsobom async/await zjednodušuje prácu s asynchrónnym kódom, robí ho zrozumiteľnejším a pohodlnejším.