Sobes.tech
Junior — Middle

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.