Refactorización de View Models con Inyección de Dependencias en Swift
Clase 7 de 18 • Curso de iOS: Modo Offline con Swift Data y Realm
Resumen
¿Cómo integrar protocolos de servicio de bases de datos en tus View Models?
Integrar protocolos de servicio de bases de datos en tus aplicativos es esencial para lograr una arquitectura robusta y escalable. En este artículo, exploraremos cómo implementar tal integración en View Models, utilizando inyección de dependencias para asegurar que tu aplicación sea flexible y fácil de mantener. Veremos cómo migrar desde un enfoque de datos moqueados a uno más real y adaptable a los servicios de bases de datos.
¿Cómo actualizar el Home View Model?
El primer paso en la refactorización es deshacerse de las dependencias directas de las funciones moqueadas y permitir que el Home View Model opere con un protocolo de servicio de base de datos definido. Aquí se detalla el proceso:
- Eliminar dependencias directas: Retira el uso directo de
MOOC Records Helper
. - Definir variable de servicio de base de datos: Crea una variable llamada
databaseService
del tipoDatabaseServiceProtocol
. - Agregar inyección de dependencias: Añade un inicializador que reciba el
DatabaseServiceProtocol
como un argumento. Esto permitirá instanciar el View Model con diferentes implementaciones de servicios, como MOOC o servicios futuros basados en SWIFTDA o Realm.
Al proceder a implementar las funciones de obtención de registros y totales, sustituye las llamadas moqueadas con tareas (tasks
) que utilicen await
para interactuar con el servicio de base de datos asíncrono.
task {
let records = await databaseService.fetchRecords()
// Procesar y actualizar vista
}
¿Cómo refactorizar el Form Record View Model?
Al igual que con el Home View Model, el objetivo con el Form Record View Model es reemplazar la lógica moqueada con operaciones basadas en el servicio de base de datos. Aquí hay algunos pasos clave:
- Modificar identificación en actualizaciones: Asegúrate de no generar un nuevo ID al actualizar un registro. Usa el ID existente para evitar conflictos en la base de datos.
- Integrar inyección de dependencias: Agrega un
databaseService
tipoDatabaseServiceProtocol
y ajusta el inicializador para aceptarlo como parámetro.
Asegúrate de eliminar el código moqueado e implementa las funciones de guardado y actualización de registros. Utiliza task
para gestionar las funciones asíncronas de guardado y logueo de errores.
task {
let success = await databaseService.saveNewRecord(record)
if success {
// Actualizar vista
} else {
// Manejar error
}
}
¿Cómo refactorizar el Record Detail View Model?
Finalmente, en el Record Detail View Model, seguimos el mismo enfoque al integrar el protocolo de servicio de base de datos:
- Crear la variable de servicio: Añade
databaseService
dentro del modelo. - Actualizar inicialización: Ajusta el constructor para aceptar este servicio como parte de la inyección de dependencias.
- Sustituir lógica moqueada: Elimina lógica innecesaria y utiliza el protocolo para realizar operaciones como eliminar registros.
El uso del task
permite asegurar que las operaciones asíncronas se manejen eficientemente.
task {
let success = await databaseService.deleteRecord(recordID)
if success {
// Actualizar vista
} else {
// Manejar error
}
}
¿Cómo manejar la compilación y pruebas?
Una vez integrado el protocolo en los View Models, es esencial realizar la compilación y pruebas para asegurar un flujo de navegación intacto. Se compilan los cambios y se revisan errores en los inicializadores de los View Models que requieren ajustes para recibir DatabaseServiceProtocol
. La prueba final es correr la aplicación y asegurarse de que todo funcione correctamente.
// Inicializar DatabaseService
let databaseService: DatabaseServiceProtocol = MOOCDatabaseService()
// Pasar servicio como parámetro
homeViewModel = HomeViewModel(databaseService: databaseService)
// Probar aplicación
application.run()
Este camino hacia una arquitectura más robusta garantiza que tu app esté preparada para la integración con bases de datos reales, mejorando notablemente su funcionalidad y fiabilidad. Continúa mejorando tus habilidades refactorizando y ajustando para resolver nuevos desafíos o requisitos. Aprovecha todo lo que has aprendido. ¡El futuro de desarrollo de tus aplicaciones es brillante!