Introducción al Patrón MVVM

1

Implementación de MVVM en Swift: Organiza y Optimiza tus Apps

2

Patrones de Arquitectura y Diseño en Desarrollo de Software iOS

3

Arquitectura MVC y MVP en Desarrollo iOS

4

Principios SOLID en Desarrollo de Software

5

Arquitectura MVVM en iOS: Principios Solid y Swift UI

Quiz: Introducción al Patrón MVVM

Estructura de un Proyecto con MVVM

6

Proyecto MVVM en Swift: Buenas Prácticas y Configuración Inicial

7

Modelo de Datos en MVVM: Creación de la Estructura Ítem en XCode

8

Creación de Modelo de Datos con Core Data en Xcode

9

Creación de Vistas en Xcode para Aplicaciones MVVM

10

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

Quiz: Estructura de un Proyecto con MVVM

Operaciones CRUD en un proyecto con MVVM

11

Crear función "add todo" en arquitectura MVVM con Core Data

12

Funcionalidades básicas para gestionar tareas en SwiftUI

13

Listar y Detallar Notas en Aplicaciones de Tareas

14

Implementación de Funcionalidad de Edición en Aplicación de Tareas

15

Archivar Todos en Aplicación de Tareas

16

Desarchivar y Restaurar Tareas en Aplicaciones de Notas

17

Eliminar tareas en una aplicación de gestión de pendientes

18

Implementación de Estado de Tarea en Aplicación de Tareas

19

Creación de Vistas Amigables en SwiftUI para Aplicaciones de Tareas

Quiz: Operaciones CRUD en un proyecto con MVVM

Clean Architecture

20

Implementación de Clean Architecture paso a paso

21

Estructura y Ventajas de la Clean Architecture

22

Estructura de Proyectos con Clean Architecture y The MovieDB API

23

Mapeo de JSON a Objetos Swift para TV Shows Populares

24

Conexión a API y Manejo de Datos en Xcode usando Clean Architecture

25

Casos de Uso en la Capa de Dominio para Aplicaciones de TV

26

Creación de la Capa de Presentación en SwiftUI con MVVM y Clean Architecture

27

Navegación en SwiftUI: Implementación de Detail View y ViewModel

Quiz: Clean Architecture

MVVM y Clean Architecture

28

Arquitectura de Software: Clean Architecture y MVVM en Proyectos Reales

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

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

10/28
Recursos

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!

Aportes 1

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

```js import Foundation import CoreData import Combine public final class ToDoViewModel: ObservableObject { @Published private(set) var todos: [TodoEntity] = [] var cancellables = Set<AnyCancellable>() private var storeContainer: NSPersistentContainer { return ToDoPersistenceManager.shared.container } init () { fetchToDos() } private func fetchToDos() { do { let request: NSFetchRequest<TodoEntity> = TodoEntity.fetchRequest() let sortDescriptor = NSSortDescriptor(key: "date", ascending: true) request.sortDescriptors = [sortDescriptor] request.returnsObjectsAsFaults = false todos = try storeContainer.viewContext.fetch(request) } catch { print("Error al recuperar ToDos: \(error)") } } private func savedata() { do { try storeContainer.viewContext.save() fetchToDos() } catch { print("Error al guardar ToDo: \(error)") } } private func getTodoIndex(_ todo: TodoEntity) -> Int? { guard let index = todos.firstIndex(where: {$0.id == todo.id}) else { return nil } return index } private func validateInput(ofText text: String) -> Bool { guard text.trimmingCharacters(in: .whitespaces).count > 2 else { return false } return true } public func addToDo() { } public func updateToDo() { } public func updateStatus() { } public func deleteToDo() { } public func archiveToDo() { } public func unArchiveToDo() { } } ```