Sobes.tech
Junior — Middle

Millised on erinevused async/await ja completion handlers kasutamisel asünkroonse koodi töötamisel?

sobes.tech AI

Vastus AI-lt

Peamised erinevused async/await ja completion handlers vahel iOS-is asünkroonse koodi töötamisel:

  • Süntaks ja loetavus: async/await võimaldab kirjutada asünkroonset koodi järjestusstiilis, mis parandab loetavust ja lihtsustab silumist. Completion handlers kasutavad sisseehitatud sulgusid, mis võivad viia "callback hell".

  • Vigade käsitlemine: async/await abil saab kasutada tavalist try/catch mehhanismi vigade käsitlemiseks, samas kui completion handlers'ites edastatakse vead tavaliselt parameetrite kaudu, mis nõuab täiendavat kontrolli.

  • Ühilduvus: async/await toetatakse Swiftis alates versioonist 5.5 ja iOS 15-st, samas kui completion handlers töötavad kõigis versioonides.

Näide async/await kasutamisega:

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("Andmed saadud: \(data)")
    } catch {
        print("Viga: \(error)")
    }
}

Näide completion handleriga:

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("Andmed saadud: \(data)")
    case .failure(let error):
        print("Viga: \(error)")
    }
}

Seega, async/await lihtsustab asünkroonse koodi töötamist, muutes selle arusaadavamaks ja mugavamaks.