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

Clase 26 de 28Curso de Patrones MVVM en iOS

Resumen

La capa de presentación es crucial porque interactúa directamente con el usuario y coordina la comunicación con las capas de dominio y datos. Este enfoque proporciona una separación de responsabilidades, asegurando que ningún componente dependa directamente de las implementaciones concretas, sino de abstracciones, como los protocolos.

Nuestra presentación se centra en los view models, que utilizan protocolos para comunicar la capa de presentación con la capa de dominio, haciendo uso del caso de uso Get Popular TV Shows Use Case Protocol. Este enfoque no solo fomenta la separación de responsabilidades, sino que también facilita el testeo.

¿Cómo se estructura un ViewModel en Clean Architecture?

Crear un ViewModel implica construir una clase que maneje datos observables y, en este caso, publicar los datos de los programas de televisión para que las vistas de Swift UI puedan observar y actualizarse automáticamente ante cualquier cambio.

import SwiftUI

final class PopularShowsViewModel: ObservableObject {
  @Published var shows: [TVShow] = []
  private let getPopularTVShowsUseCase: GetPopularTVShowsUseCaseProtocol

  init(getPopularTVShowUseCase: GetPopularTVShowsUseCaseProtocol) {
    self.getPopularTVShowsUseCase = getPopularTVShowUseCase
  }

  func loadPopularShows() {
    Task {
      do {
        let shows = try await getPopularTVShowsUseCase.execute()
        await MainActor.run {
          self.shows = shows
        }
      } catch {
        print("Error: \(error)")
      }
    }
  }
}

En este ejemplo, PopularShowsViewModel declara una propiedad @Published para los programas de televisión shows y utiliza un protocolo para el caso de uso GetPopularTVShowsUseCaseProtocol. La función loadPopularShows carga los programas populares mediante una llamada asincrónica al caso de uso.

¿Cómo se desarrolla una vista en Swift UI para mostrar los programas de televisión?

Crear una vista en Swift UI implica declarar una referencia al ViewModel que manejará la lógica de la vista y permitir el acceso a los datos necesarios para presentar al usuario.

struct PopularShowsView: View {
    @StateObject private var viewModel = PopularShowsViewModel()

    var body: some View {
        List(viewModel.shows, id: \.id) { show in
            Text(show.name)
        }
        .onAppear {
            Task {
                await viewModel.loadPopularShows()
            }
        }
    }
}

La estructura PopularShowsView utiliza StateObject para manejar el viewModel, y muestra una lista de programas con show.name en una vista tipo List. Para asegurar la carga de datos al iniciar la vista, se ejecuta el método loadPopularShows() dentro de onAppear.

¿Qué ajustes necesitan hacerse para ejecutar la aplicación correctamente?

Para ejecutar correctamente la aplicación, se debe asegurar que el punto de entrada de la aplicación llama correctamente a la vista que hemos configurado. Esto generalmente se hace en el archivo ContentView.

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            PopularShowsView()
        }
    }
}

En este caso, PopularShowsView se llama desde la estructura principal de la aplicación, permitiendo que la vista en cuestión sea cargada al iniciarse la aplicación.

Este enfoque, unido a un diseño modular y separando las responsabilidades, logra que las aplicaciones sean más testeables y fáciles de mantener, tal y como se promueve en la arquitectura Clean. ¡Continúa explorando y aprendiendo para llevar tus habilidades de desarrollo a nuevos niveles!