Table of Contents
Hoy en dia todas las apps se conectan en algún momento con servidores para mostrar datos. Por esto es muy importante tener una implementación de cliente bien definida(y simple) para evitar problemas en esta capa tan importante de la aplicación. A continuación veremos un patrón muy usado en servicios REST y cómo podemos mejorarlo usando las últimas herramientas que nos proporciona Rx y Swift. En Apiumhub hemos decidido escribir un articulo sobre cómo simplificar la capa de datos con MoyaRx y Codable, espero que os guste.
La capa de datos con MoyaRx y Codable
Modelo de datos
Para el modelo de datos es muy común usar un constructor a partir de un diccionario [String:Any]. Existen librerias como SwiftyJSON que facilitan el manejo de los diccionarios, en nuestro caso optamos por utilizar “guard let” para acceder a los valores de manera segura.
Repositorio
La capa de repositorio se encarga de encapsular las llamadas del cliente REST. En el siguiente código de usa Alamofire como cliente REST. Esta librería es ampliamente usada para abstraer y facilitar las llamadas a servicios web. Alamofire usa internamente la api de NSURLSession de Apple.
Mejorando la capa de REST con Codable y Moya
Uno de los objetivos que teníamos era simplificar los componentes implicados en esta capa. Tener un inicializador en cada modelo era costoso y propenso a errores. Evitar usar inicializadores failables. Por otro lado, el repositorio devuelve un closure de completion con dos valores opcionales que hay que comprobar en la capa superior, normalmente el servicio.
Modelo con Codable
Una de las novedades de Swift 4 fue la introducción de Codable. El protocolo Codable es un typealias de la combinación de los protocolos existentes Encodable y Decodable:
Este protocolo facilita la codificación y decodificación de datos, todo lo que hay que hacer es implementarlo en nuestros modelos de datos. Los tipos nativos y las colecciones de tipos Codable ya lo implementan por defecto, en el caso de crear tipos propios, estos deben implementar también el protocol. En el siguiente código vemos como hacer que el modelo Product implemente Codable.
Codable nos permite definir el valor de las claves en las que se codificará o decodificará con el enumerado CodingKeys. Este enumerado debe ser exhaustivo para todas las propiedades de la estructura. Si se omite alguna propiedad del modelo en el enumerado CodingKeys, esta no se tendrá en cuenta en el momento de codificar o decodificar este modelo.
Al usar Codable nos ahorramos el inicializador
Repositorio usando Moya
Moya es una librería que actua como abstracción de la capa de datos que internamente utiliza Alamofirepara hacer las request REST. Moya nos proporciona muchas funcionalidades como:
- Targets: Enumerado con toda las especificación de los endpoints de manera tipada.
- Plugins: Son clases que implementan el protocolo PluginType que tienen diferentes métodos que se ejecutan al hacer una request HTTP. Entre otras cosas, nos permiten interceptar las requests y modificarlas o logear información.
- EndpointClosures: permite modificar los endpoints que se han definido en el Target.
- StubClosure: permite devolver stubs para las requests, actuando como fake server.
Moya tiene una extensión reactiva llamada MoyaRx que permite encapsular la respuesta de una request en un Observable de Rx. En el siguiente código vemos cómo queda la implementación del repositorio anterior utilizando MoyaRx.
Conclusiones: capa de datos con MoyaRx y Codable
- Hemos reducido la cantidad de código productivo tanto en el repository como en los modelos eliminando así la necesidad de testearlos.
- El parseo ahora se hace utilizando el operador - map(d: Decodable) . Este operador recibe cualquier tipo que conforme el protocolo Decodable y devuelve un observable con el objecto mapeado, si falla en alguna parte, recibiremos una excepción con información detallada de cual ha sido el motivo.
- El repository ahora devuelve un observable de Product, podremos aplicar cualquier tipo de transformación sobre el resultado utilizando los operadores de Rx.
- Si una request se realiza, recibiremos un observable con eventos del tipo de la respuesta, por otro lado, si falla, se enviará un evento de error que podemos recuperar al subscribirnos. De esta manera, hemos eliminado los opcionales en la respuesta del repository.
Suscríbete a nuestro newsletter para estar al día de la capa de datos con MoyaRx y Codable y desarrollo movil en general !
Si este artículo sobre la capa de datos con MoyaRx y Codable te gustó, te puede interesar:
Tendencias en aplicaciónes móviles
Debugging con Charles Proxy en Android emulator
Integración Continua en iOS usando Fastlane y Jenkins
Meetups de arquitectura de software