Sobes.tech
Middle

Qual manipulador de conclusão você escreveu?

sobes.tech IA

Resposta da IA

Tenho escrito vários manipuladores de conclusão para várias tarefas, incluindo:

  • Processamento de resultados de pedidos de rede (obtenção de dados, estado de execução).
  • Operações assíncronas com bases de dados (salvar, ler, atualizar).
  • Operações do sistema de ficheiros (leitura, escrita, eliminação).
  • Animações e interfaces de utilizador (conclusão de animações, manipulação de gestos do utilizador).
  • Operações assíncronas personalizadas com capacidade de transmitir resultados e erros.

Por exemplo, ao trabalhar com URLSession, frequentemente uso este padrão:

URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error {
        // Tratamento do erro
        completion(.failure(error))
        return
    }
    guard let httpResponse = response as? HTTPURLResponse,
          (200...299).contains(httpResponse.statusCode),
          let data = data else {
        // Tratamento de resposta ou dados inválidos
        completion(.failure(URLError(.badServerResponse)))
        return
    }
    // Processamento bem-sucedido dos dados
    do {
        let model = try JSONDecoder().decode(SomeModel.self, from: data)
        completion(.success(model))
    } catch {
        // Tratamento do erro de decodificação
        completion(.failure(error))
    }
}.resume()

onde completion é uma closure do tipo (Result<SomeModel, Error>) -> Void. O uso de Result permite distinguir claramente entre sucesso e erro.