es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo el Modelo notifica su cambio al ViewModel en el patrón MVVM de iOS.

La mayoría de los artículos sobre MVVM describen que cuando el modelo cambia, por ejemplo, cuando se hacen disponibles nuevos datos y necesitamos actualizar la interfaz de usuario, el modelo notifica al ViewModel.

Pero no entiendo cómo se comunica el modelo con el ViewModel para notificar sobre su cambio.

En el código de abajo, utilicé observadores de propiedades para vincular la vista y el ViewModel. Y sé que puedo cambiar mi modelo asignando un nuevo valor como self.person.value.name = name en el ViewModel.

He leído muchos artículos sobre mvvm y creo haber escrito un ejemplo adecuado, pero incluso en este código no logro comprender el concepto de que el modelo notifica su cambio al ViewModel. ¿Puede explicarlo con ejemplos?

“`swift
class Observable<t> {
var value: T {
didSet {
self.listener?(value)
}
}

<pre><code>var listener: ((T) -> Void)?

init(_ value: T) {
self.value = value
}

func subscribe(listener: @escaping (T) -> Void) {
listener(value)
self.listener = listener
}
</code></pre>

}

struct Person {
var name: String
var age: Int
}

struct MyViewModel {
var person: Observable<person>

<pre><code>init(person: Person) {
self.person = Observable(person)
}

func changePersonName(with name: String) {
person.value.name = name
}
</code></pre>

}

class ViewController: UIViewController {

<pre><code>@IBOutlet weak var infoLabel: UILabel!

let viewModel = MyViewModel(person: Person(name: "Mike", age: 100))

override func viewDidLoad() {
viewModel.person.subscribe { [weak self] person in
self?.infoLabel.text = person.name + " & " + "\(person.age)"
}
}
</code></pre>

}
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En el código anterior, el Modelo no notifica directamente al ViewModel acerca de sus cambios. En cambio, el ViewModel es responsable de observar los cambios en el Modelo mediante el uso de la clase Observable.

    En esta implementación, la clase Observable actúa como un mediador entre el Modelo y el ViewModel. Cuando el Modelo cambia en el ViewModel al asignar un nuevo valor, el observador de propiedad didSet se activa, actualizando el valor de la instancia de Observable, y a su vez, activa el cierre del escuchador.

    El ViewModel escucha los cambios utilizando el método subscribe y actualiza sus propias propiedades en consecuencia. En el código anterior, el ViewModel escucha los cambios en la instancia person y actualiza la interfaz de usuario configurando la propiedad de texto de infoLabel con el nuevo nombre y edad de la persona.

    Por lo tanto, es el ViewModel el que escucha los cambios en el Modelo, no al revés. Esto permite una mayor separación de responsabilidades y un diseño más modular.

Comments are closed.