Creación de View Models con Combine en Swift para Aplicaciones Reactivas

Clase 10 de 28Curso de Patrones MVVM en iOS

Resumen

Los ViewModel actúan como intermediarios entre la vista y el modelo, permitiendo la comunicación y sincronización de datos. En este contexto, Swift y su framework Combine son herramientas esenciales que facilitan el manejo reactivo de datos, permitiendo que los cambios en el modelo se reflejen automáticamente en la interfaz del usuario.

¿Cómo crear un ViewModel en Swift?

Para empezar a entender cómo se crea un ViewModel en Swift es fundamental establecer un entorno organizado:

  1. Paquetes base: Asegúrate de que tu proyecto tiene paquetes organizados como Commons, Models, Views y crea un nuevo paquete llamado ViewModels.
  2. Creación del archivo: Dentro del paquete ViewModels, crea un archivo llamado TodoViewModel.swift.
  3. Importaciones necesarias:
    • Foundation: Herramientas básicas para manejar datos en Swift.
    • CoreData: Utilizado para la persistencia de datos.
    • Combine: Framework para manejo de datos reactivos.
import Foundation
import CoreData
import Combine

¿Cómo definir un ViewModel en Swift?

  1. Creación de la clase: Define una clase pública final llamada TodoViewModel, marcándola como observable para que las vistas puedan suscribirse a sus cambios automáticamente:
public final class TodoViewModel: ObservableObject {
    // Variables y propiedades aquí
}
  1. Manejo de tareas: Para almacenar las tareas, crea un conjunto:
@Published var todos: [TodoEntity] = []
  1. Prevención de fugas de memoria: Utiliza una colección para cancelar suscripciones cuando sea necesario:
private var cancellables: Set = []

¿Cómo cargar y gestionar datos con Combine y CoreData?

  1. Contenedor de datos persistentes: Crea una variable que acceda al NSPersistentContainer.
private var storeContainer: NSPersistentContainer = {
    return TodoPersistentManager.shared.container
}()
  1. Función para obtener datos: Usa una función para cargar tareas automáticamente al inicializar la clase:
private func fetchTodos() {
    let request: NSFetchRequest = TodoEntity.fetchRequest()
    request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]
    request.returnsObjectsAsFaults = false
    do {
        todos = try storeContainer.viewContext.fetch(request)
    } catch {
        print("Error recuperando las tareas: \(error)")
    }
}

¿Cómo implementar funciones adicionales?

Dentro del ViewModel, podemos definir varias funciones útiles como:

  • Guardar datos: Asegura que los cambios se reflejen al guardar los datos.
private func saveData() {
    do {
        try storeContainer.viewContext.save()
        fetchTodos()
    } catch {
        print("Error guardando datos: \(error)")
    }
}
  • Validar el input: Asegúrate de que el input del usuario tenga al menos dos caracteres:
func validateInput(text: String) -> Bool {
    return !text.trimmingCharacters(in: .whitespaces).isEmpty
}
  • Metodologías CRUD: Crear métodos para añadir, actualizar, eliminar, archivar y desarchivar elementos.
public func addTodo() { /* implementación aquí */ }
public func updateTodo() { /* implementación aquí */ }
// Continúa con otras funciones CRUD

Estos pasos y definiciones te permiten estructurar un ViewModel robusto que gestiona eficientemente la comunicación entre las vistas y el modelo. Al utilizar Combine y CoreData con Swift, simplificas el manejo de datos de manera reactiva y segura, evitando cargas manuales tediosas y mejorando la experiencia del usuario al hacer la interfaz más responsiva y actualizada frente a los cambios en los datos. ¡Sigue aprendiendo y mejorando tus habilidades en Swift!