Implementando NetworkCoordinator usando Combine+SwiftUI

Andres Felipe Ocampo
4 min readMar 26, 2021

--

Aprenderemos como diseñar un BaseProvider eficiente y fácil de usar y copiar aprovechando esta nueva técnica que nos propone Apple, con protocolos y una estructura personaliza para gestionar el Endpoint.

Al final, tendrás una implementación lista para usar que puedes copiar y pegar fácilmente en tu aplicación y expandirla de la manera que desees.

El código fuente completo está disponible al final del artículo.

Empecemos

Antes de sumergirnos en el código, describamos primero todos los componentes de nuestra capa de red:

  • Endpoint: unastructque tiene pathy queryItemscomo propiedades. Al definir extensiones en él, podemos crear convenientemente una URL base de nuestras API REST, definir endpoints y headers específicos.
  • Codable models: objetos simples que se pueden crear a partir de JSON.
  • Network Controller: responsable de trabajar directamente con URLSessionTasky decodificar un Codablemodelo a partir de los datos. Por ejemplo.
  • Logic Controller: abstrae el trabajo que realiza el Network Controller de la capa de presentación (vistas / controladores de vista) y proporciona métodos simples para consultar modelos. Por ejemplo, puede tener un getMoviesFromiTunes()método que llame al método requerido de un Network Controller y devuelva una matriz de peliculas de las rss de Apple.

Ahora comencemos a crear cada componente, uno por uno.

Codable models

Vamos a buscar los datos que vamos obtener de la Api de Apple rss que comentamos Anteriormente, tiene una pinta más o menos así:

Así que creamos nuestro modelo de datos, a por ello:

Una vez tenemos el modelo terminado, ahora pasamos a otro componente

Endpoint

Definimos un struct Endpoint que posteriormente extenderemos para que coincida con los requisitos específicos de la API:

Ahora, necesitamos crear una extensión en la que construimos la URLAPI y también definimos las headerspropiedades que podemos anexar para nuestros proyectos si es necesario:

Ahora definamos algunos Endpoint:

Usaremos solo el primero. He proporcionado los dos últimos para mostrar cómo podemos agregar parámetros y establecer la ruta de manera conveniente.

Ahora es el momento del NetworkController

NetworkController

Primero definamos un protocolo para esta clase y como podemos ver, tenemos un método para consultar un solo modelo codificable.

Ahora necesitamos crear la implementación concreta del protocolo, con algunos ajustes he metido una gestión de errores que seguro le va a gusta a Carlos García González, en el código podeis ver que se retorna una URLSession con una gestión de datos y control de errores de manera muy facil y sencilla.

Bien vamos al LogicController

Logic Controller / Provider

Debido a que queremos cargar las peliculas del rss de iTunes y nuestro componente de vista se llamará MovieView , nuestro controlador lógico se llamará MoviesLogicController. Primero, comencemos con un protocolo:

MoviesLC

Como podemos ver, trabajamos directamente con endpoint y llamamos a los métodos requeridos de NetworkController. Al marcar la clase como final, indicamos a otros desarrolladores que esta clase no está diseñada para ser subclasificada.

Finalmente, podemos probar lo que hemos creado.

MovieVM

Basicamente enlazamos la MoviesView con su MoviesVoewModel a través del protocolo ObservableObject que nos permitirá tener acceso a los @Publisher, y solo debemos invocar nuestra capa lógica para alimentar nuestro array de Películas.

ViewModel

MoviesView

Es nuestra vista que lo único de momento se encarga de pintar el nombre del Artista que recibimos de la llamada a la Api de Apple.

El proyecto lo encontráis en este enlace de Github

Happy weekend Coding!!.

--

--

Andres Felipe Ocampo
Andres Felipe Ocampo

Written by Andres Felipe Ocampo

Digital Manager and Sr Lead iOS Engineer

No responses yet