En mi modelo tengo una matriz de objetos llamados eventos. Me gustaría que mi controlador sea notificado siempre que se agregue un nuevo objeto a los eventos.Observación Cambios en una matriz mutable usando KVO contra NSNotificationCenter
pensé que una buena manera de hacer esto sería usar el patrón de MVA para ser notificado cuando se agregan (a partir de un nuevo objeto) los acontecimientos cambios
// AppDelegate
// events is a NSMutableArray @property/@synthesize etc...
[appDelagate addObserver:self
forKeyPath:@"events"
options:NSKeyValueObservingOptionNew
context:NULL];
Pero el método observeValueForKeyPath no era siendo llamado y he descubierto que las matrices no son compatibles con MVA :-(
Una opción es activar manualmente el método llamando willChangeValueForKey para la keyPath
// ViewController
[self willChangeValueForKey:@"events"];
[self.events addObject:event];
[self didChangeValueForKey:@"events"];
Pero esto se siente pesado ya que probablemente debería también hacer un seguimiento del estado antes y después de mi serie de eventos para que se pueda acceder desde el método observeValueForKeyPath.
Un enfoque podría ser usar una matriz estándar (en lugar de mutable) y crear/establecer una nueva instancia de eventos cada vez que quiera agregar un nuevo objeto, o podría hacer una propiedad separada que haga un seguimiento de cuántos los elementos están en la matriz mutable (me gustaría poder observar @ "events.count").
Otra opción sería usar NSNotificationCenter. También leí algunas respuestas que sugieren el uso de bloques (pero no tengo idea de por dónde empezar con eso).
Finalmente, ¿podría mantener una instancia de mi controlador en mi delegado y solo enviar un mensaje relevante?
// Delegate
[myController eventsDidChange];
¿Es extraño mantener una referencia a un controlador de un delegado?
Tengo dificultades para entender cómo elegir cuál es el mejor enfoque para usar, por lo que cualquier consejo sobre el rendimiento, la futura flexibilidad del código y las mejores prácticas es muy apreciado.
¡Gracias! mutableArrayValueForKey hace el truco. ¿Tiene algún consejo sobre cómo elegir qué patrón usar (KVO, NotificationCenter, delegar) cuando desea comunicarse entre el modelo y el controlador? – MathewS
Ciertamente me falta algo aquí. ¿Podría alguien explicar por qué se llamaría setEvents si alguien añadiera o insertaraObject: atIndex: un objeto para la matriz mutable de respaldo? –