Sobes.tech
Junior — Middle

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į.