Implementando NetworkCoordinator usando Combine+SwiftUI
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: una
struct
que tienepath
yqueryItems
como 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
URLSessionTask
y decodificar unCodable
modelo 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 URL
API y también definimos las headers
propiedades 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:
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.
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!!.