Cómo simplificar la capa de datos con MoyaRx y Codable

Compartir esta publicación

Share on facebook
Share on linkedin
Share on twitter
Share on email

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.


Conversion Post EN

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 

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Suscríbete a nuestro boletín de noticias

Recibe actualizaciones de los últimos descubrimientos tecnológicos

Acerca de Apiumhub

Apiumhub reúne a una comunidad de desarrolladores y arquitectos de software para ayudarte a transformar tu idea en un producto potente y escalable. Nuestro Tech Hub se especializa en Arquitectura de Software, Desarrollo Web & Desarrollo de Aplicaciones Móviles. Aquí compartimos con usted consejos de la industria & mejores prácticas, basadas en nuestra experiencia.

Posts populares
Descarga Grow Professionally: Inside Apiumhub's Dev Team

¿Estás orientado a Datos?

Construyamos tu éxito juntos.

Contáctanos

¿Tienes un proyecto desafiante?

Podemos trabajar juntos