Sobes.tech
Junior — Middle

Quais são as diferenças entre usar async/await e handlers de conclusão ao trabalhar com código assíncrono?

sobes.tech IA

Resposta da IA

As principais diferenças entre async/await e os manipuladores de conclusão ao trabalhar com código assíncrono no iOS:

  • Sintaxe e legibilidade: async/await permite escrever código assíncrono em estilo sequencial, o que melhora a legibilidade e facilita a depuração. Os manipuladores de conclusão usam closures aninhadas, o que pode levar ao "inferno de callbacks".

  • Tratamento de erros: com async/await, pode-se usar o mecanismo habitual try/catch para tratar erros, enquanto nos manipuladores de conclusão, os erros geralmente são passados por parâmetros, exigindo verificações adicionais.

  • Compatibilidade: async/await é suportado no Swift a partir da versão 5.5 e iOS 15, enquanto os manipuladores de conclusão funcionam em todas as versões.

Exemplo com 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("Dados recebidos: \(data)")
    } catch {
        print("Erro: \(error)")
    }
}

Exemplo com manipulador de conclusão:

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("Dados recebidos: \(data)")
    case .failure(let error):
        print("Erro: \(error)")
    }
}

Assim, async/await simplifica o trabalho com código assíncrono, tornando-o mais compreensível e conveniente.