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.

guard let

 

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.

Alamofire

 

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​:

Encodable and Decodable protocols

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

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 initializer

 

Repositorio usando Moya

Moya es una librería que actua como abstracción de la capa de datos que internamente utiliza Alamofire​para 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.

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

Patrón MVP en iOS

Debugging con Charles Proxy en Android emulator

Por qué Kotlin?   

Integración Continua en iOS usando Fastlane y Jenkins  

Meetups de arquitectura de software  

MVPP en Android

Kotlin vs Java