Sobes.tech
Junior — Middle

Koje su razlike između korišćenja async/await i handlera za završetak prilikom rada sa asinhronim kodom?

sobes.tech АИ

Одговор од АИ

Основне разлике између async/await и обрађивача завршетка при раду са асинхроним кодом у iOS:

  • Синтакса и читљивост: async/await омогућава писање асинхроних кодова у секвенцијалном стилу, што побољшава читљивост и олакшава дебаговање. Обрађивачи завршетка користе унутрашње затвараче, што може довести до "пекла позиваоца".

  • Обрада грешака: са async/await можете користити уобичајени механизам try/catch за обраду грешака, док се у обрађивачима завршетка грешке обично преносе кроз параметре, што захтева додатне провере.

  • Компатибилност: async/await је подржан у Swift-у од верзије 5.5 и iOS 15, док обрађивачи завршетка раде у свим верзијама.

Пример са 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("Датум примљен: \(data)")
    } catch {
        print("Грешка: \(error)")
    }
}

Пример са обрађивачем завршетка:

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("Датум примљен: \(data)")
    case .failure(let error):
        print("Грешка: \(error)")
    }
}

Стога, async/await поједностављује рад са асинхроним кодом, чинећи га разумљивијим и погоднијим.