Pregunta

¿Debería poder configurar un observador en un objeto proxy, cambiar a qué apunta el objeto proxy y aún poder observar cambios en el objeto real?

Un ejemplo podría explicar esto mejor.Considera lo siguiente.

En el encabezado:

@interface MyController : NSObject {   

  MyWidgetModel * aProxyObject;

}

En una inicialización o despertar del método NIB:

-(void)awakeFromNib {

 // Init the proxy object. Could be as an empty widget 

 [aProxyObject addObserver:self 
                forKeyPath:@"widgetName"
                   options:NSKeyValueObservingOptionNew 
                   context:nil];

}

Algún otro método que cambia el objeto:

-(void)changeWidget:(MyWidgetModel *)aNewWidget {

  aProxyObject = aNewWidget;

}

Esto no activa ningún cambio en aNewWidget.Sin embargo, si muevo el addObserver Después de la asignación de la siguiente manera, funciona:

-(void)changeWidget:(MyWidgetModel *)aNewWidget {

   [aProxyObject removeObserver:self forKeyPath:@"widgetName"];

   aProxyObject = aNewWidget;

   [aProxyObject addObserver:self 
                  forKeyPath:@"widgetName"
                     options:NSKeyValueObservingOptionNew 
                     context:nil];
}

Supongo que el primer caso no funciona porque el observador está observando el puntero de memoria de la referencia del objeto proxy y, como no hay ningún objeto en el momento en que se agrega, el observador proxy no tiene nada que observar.Sin embargo, si inicio un widget y observo eso, entonces asigno el objeto proxy aNewWidget todavía no observa cambios a menos que agregue el observador después de la asignación (y, por supuesto, cree la necesidad de eliminar el observador en un cambio de objeto).

Además, ¿qué sucede en este escenario si aNewWidget se destruye?Debido a que el observador está en el proxy, ¿esto niega la necesidad de eliminar al observador antes de destruir el objeto?(Supongo que no es así).

Idealmente, me gustaría poder configurar el observador en el proxy e intercambiar cualquier referencia de widget que desee con el objeto proxy sin tener que preocuparme por agregar y eliminar el observador a menos que el MyController la clase desaparece, en cuyo caso podría manejar la eliminación del observador en el acuerdo.

Se agradece cualquier ayuda/comentario/consejo.

¿Fue útil?

Solución

La ruta clave debe ser compatible con KVC.Así que aquí está el código:

@interface MyController : NSObject {   
  MyWidgetModel * aProxyObject;
}
@property (nonatomic, retain) MyWidgetModel * aProxyObject;

No olvide sintetizarlo en el archivo de implementación.Luego use este código para agregar el observador:

[self addObserver:self 
            forKeyPath:@"aProxyObject"
               options:NSKeyValueObservingOptionNew 
               context:nil];

Por favor revisa mi edición.Cambié la asignación para retener.Quizás sea mejor para ti.Deberías intentar elegir lo mejor para ti.Sólo quiero decir que no importa en KVO.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top