Peticiones al servidor

Clase 17 de 36Curso de Desarrollo de Aplicaciones iOS con SwiftUI

Resumen

¿Cómo programamos nuestro ViewModel en Swift?

Desarrollar aplicaciones en Swift utilizando el protocolo Model-View-ViewModel (MVM) es una estrategia efectiva para mantener el código organizado y fácil de mantener. A continuación, abordaremos la implementación de la clase ViewModel, responsable de manejar la interacción con el servidor para obtener los datos necesarios.

¿Por qué usamos una clase en lugar de una estructura?

En Swift, la elección entre una clase y una estructura depende de las necesidades de mutabilidad y referencia de memoria de los datos. Las clases tienen un comportamiento referencial, lo que permite instanciarlas y acceder a su información desde cualquier parte del programa. Esto facilita la recuperación y actualización de información desde el servidor, esencial para mantener la fluidez y consistencia de los datos mostrados en la interfaz de usuario.

¿Cómo hacemos la comunicación con el modelo?

Para comunicar la vista con el ViewModel, instanciamos su clase. Entre el modelo y el ViewModel, utilizamos property wrappers diferentes, destacando @Published. Este permite que las propiedades emitidas sean observadas y actualizadas automáticamente por la vista.

class ViewModel: ObservableObject {
    @Published var gamesInfo: [Game] = []
    // Inicialización y métodos adicionales aquí
}

¿Cómo se realiza la petición al servidor?

El ViewModel debe conectarse al servidor, enviar una solicitud GET y manejar la información recibida. El proceso se inicia creando una URL válida y un URLRequest, luego estableciendo el tipo de solicitud como GET.

let url = URL(string: "tu_API_URL")!
var request = URLRequest(url: url)
request.httpMethod = "GET"

¿Cómo se maneja la respuesta del servidor?

Para procesar los datos del servidor, se implementa un URLSession con un DataTask. Este maneja la respuesta, verificando posibles errores y decodificando los datos JSON recibidos en el tipo deseado. En nuestro caso, se decodifica a un arreglo de objetos Game.

URLSession.shared.dataTask(with: request) { data, response, error in
    if let data = data {
        do {
            let decodedData = try JSONDecoder().decode([Game].self, from: data)
            DispatchQueue.main.async {
                self.gamesInfo = decodedData
            }
        } catch {
            print("Error al decodificar JSON: \(error)")
        }
    } else if let error = error {
        print("Error en la solicitud: \(error)")
    }
}.resume()

¿Cómo vinculamos los datos con la vista?

Para que la vista acceda a los datos del ViewModel, se utiliza @ObservedObject. Así, las vistas podrán escuchar los cambios en las propiedades publicadas y actualizarse dinámicamente.

struct GamesView: View {
    @ObservedObject var viewModel = ViewModel()
    
    var body: some View {
        List(viewModel.gamesInfo) { game in
            Text(game.title)
        }
    }
}

Con esta estructura, Swift nos permite obtener datos del servidor de forma eficiente y mostrarlos dinámicamente, asegurando que la aplicación responda rápidamente a cambios y actualizaciones. Esta guía te permite integrar y visualizar datos capturados del servidor en Swift, creando una experiencia de usuario fluida y robusta. ¡Sigue avanzando y perfeccionando tus aplicaciones con cada lección!