Ejercicios de arquitecturas iOS, parte II
Tenemos la aplicación para consultar el tiempo que ya usamos en el módulo de tecnologías de desarrollo y queremos cambiarla para que en lugar de usar MVC use MVVM.
IMPORTANTE: Abre el
.xcworkspace
, no el.xcodeproj
como habitualmente. Tras abrirlo deberías ver dos proyectos: el principalEltiempo
y otro "secundario"Pods
con las librerías necesarias. Haz unbuild
del proyecto antes de empezar a trabajar con él, para que se compile la librería Bond y las otras dependencias.
Carpetas para los fuentes
Lo primero será crear las "carpetas" necesarias para los fuentes (o groups como se llaman en Xcode)
- Crea un group llamado
Vista
(File > New group...
) y mueve a él la claseViewController
, ya que en MVVM elViewController
es parte de la vista. - Crear otro group llamado
ViewModel
y en él crear un archivoTiempoViewModel
con una clase del mismo nombre vacía por el momento
Ensamblaje de vista, modelo y viewmodel (1 punto)
En la clase de la vista (el ViewController
) añadir una propiedad que represente al viewmodel
let viewModel = TiempoViewModel()
En el TiempoViewModel
añadir una propiedad que represente al modelo
let modelo = TiempoModelo()
Mostrar la descripción del tiempo (4 puntos)
En este apartado conseguiremos que al pulsar en el botón "consultar tiempo" la descripción en modo texto (p.ej. "sol") aparezca en la pantalla del dispositivo.
En el TiempoViewModel
- Añade un
import Bond
- Crear un
observable
de tipoString
llamadoestado
, con valor inicial la cadena vacía (mira la sintaxis en transparencias/apuntes) - Crea un método
consultarTiempo
que admita como parámetro unString
con el nombre de la localidad a consultar
func consultarTiempo(de localidad : String) {
//AQUI
1. LLama a consultarTiempo del modelo. Pásale la localidad y como segundo parámetro una clausura a la que el modelo llamará cuando el servidor devuelva el estado del tiempo. Esta clausura recibe dos parámetros, el estado del tiempo como una cadena, y otra cadena con la url del icono que lo representa
2. Dentro de esa clausura actualiza el observable "estado" con el valor del primer parámetro, más tarde nos ocuparemos del icono
}
Ahora en la vista
- en el método consultarTiempoPulsado sustituir la llamada al modelo por
self.viewModel.consultarTiempo(de: loc)
- en el
viewDidLoad()
vincular la propiedadestado
delviewModel
al texto de la etiquetaestadoLabel
Mostrar el icono del tiempo (3 puntos)
- Haz lo mismo para el icono del tiempo, solo que será más complicado ya que vinculamos un String con un icono (
UIImage
)
.filter {
icono in
return icono != ""
}
.map {
icono in
let urlIcono = URL(string:icono)!
let datosIcono = try! Data(contentsOf:urlIcono)
let imgIcono = UIImage(data: datosIcono)
return imgIcono!
}