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.
classViewModel:ObservableObject{@Publishedvar 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 iniflet data = data {do{let decodedData =tryJSONDecoder().decode([Game].self, from: data)DispatchQueue.main.async{self.gamesInfo = decodedData
}}catch{print("Error al decodificar JSON: \(error)")}}elseiflet 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.
structGamesView:View{@ObservedObjectvar viewModel =ViewModel()var body:someView{List(viewModel.gamesInfo){ game inText(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!
Juan se equivoca al decir que MVVM es un protocolo, MVVM NO es un protocolo sino una arquitectura, existen diferentes arquitecturas como pueden ser : MVVM, VIPER, MVP y la clásica MVC.Recuerden que Tampoco hay que confundir arquitecturas con patrones de diseño, los patrones de diseño son otros (Singleton, Factory, etc).
Creo que sí lo dice en las primeras clases, en esta a lo mejor se le cruzaron los cables, suele pasar.
me sale esto cuando quiero acceder a la api en heroku
Heroku ahora es pago, seguro no pagaron... Toca buscar otra API gratuita y aplicar lo aprendido aquí en un nuevo proyecto
El Canvas crashea cuando se le agrega una peticion HTTP (pero funciona bien en el simulador. Alguien pudo solucionarlo? IOS 16+
pense que era un error de mi end pero es verdad, en el simulador si funciona
Probe poner como primer tab item la de Games, si lo hago de esta forma no se muestra bien el resultado del json ya que la pantalla no espera a que la petición termine y me muestra nil en el print, al esperar un tiempo y ver en la consola que la petición
ya termino cambio entre los tab item y regreso al de Games en esta ocasión ya me muestra bien el print por que la data ya fue cargada.
Saben como hacer que la pantalla espere a que la petición termine? y mientras termina mostrar un loading...?
Gracias!
No sean tan desesperados como yo , en la próxima clase se entiende muy bien el concepto y ObservableObject se encarga de todo.
jajaj me paso lo mismo.... gracias amigo
Las clases que no seran heredadas deben ser finales para ahorrar recursos. (Dicho por apple en 2015)
Ahora se utiliza la macro @Observable en lugar de extender de ObservableObjec
En esta linea de una de las vistas@ObservedObject var todosLosVideojuegos = ViewModel(), no deberiamos hacer referencia a un protocol de viewModel para comunicarnos entre clases? en vez de apuntar directamente a la clase?. Esto para cumplir con uno de los patrones de SOLID, Sustitución de Liskov.
Hola Juan, saludos desde Venezuela. En mi pantalla de GamesView aparece el error "Cannot find "gamesInfo in scope". Mi código esta idéntico al tuyo. Que crees que pudiera estar sucediendo? Gracias de antemano.
Ya miraste si lo tienes bien escrito? recuerda tener en cuenta las mayúsculas
estoy teniendo es problema, alguno igual?
Es posible que la petición este retornando un array vació y por eso el error.
Ahora si el error te lo muestra cuando ejecutas el simulador tendrías que revisar si la petición HTTP se esta haciendo correctamente; en cambio si te aparece desde el "preview" quiero pensar que como no se esta ejecutando la aplicación no almacena el valor en la variable de la vista aunque en el VM si tengamos información de la API
ya funciona! fijate en los recursos de la clase, esta el nueo link
alguien tendrá un ejemplo con post :D para un login
Hola Compañeros
Estoy teniendo problemas con el simulador de xcode, por lo visto no me permite hacer las solicitudes http
Alguien ha tenido el mismo problema ?
Saludos.
No se como ayudarte, pero creo que es mejor buscar la solucion en StackOverflow que en Platzi. Allí siempre se me soluciona todo.
Hola compañeros.
Saben el motivo por el que xcode deja de reconocer las palabras reservadas, todas se ven en letra y blanca y eso afecta la ejecución del código
Hola Diego, por lo regular tan solo es un bug de xcode, te recomiendo reiniciarlo o hacer clean build en la barra de herramientas en la seccion de product. saludos : )
la api ahora va sin el guion (gamestreamapi.heroku...
)
2024: La llamada realizada con Alamofire.import Foundation