Domanda

Dovrei poter impostare un osservatore su un oggetto proxy, modificare ciò che l'oggetto proxy punta e sarà ancora in grado di osservare le modifiche sull'oggetto reale?

Un esempio potrebbe spiegare questo meglio. Considera quanto segue.

Nell'intestazione:

@interface MyController : NSObject {   

  MyWidgetModel * aProxyObject;

}
.

In un'inizializzazione o sveglio dal metodo NIB:

-(void)awakeFromNib {

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

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

}
.

Qualche altro metodo che modifica l'oggetto:

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

  aProxyObject = aNewWidget;

}
.

Ciò non attira alcuna modifica in aNewWidget. Tuttavia, se spostamento del addObserver su dopo l'assegnazione come segue, funziona:

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

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

   aProxyObject = aNewWidget;

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

Assumendo che il primo caso non funziona sia perché l'osservatore osservare il puntatore della memoria del riferimento dell'oggetto proxy e, in quanto non vi è alcun oggetto al momento in cui viene aggiunto l'osservatore del proxy non ha nulla da osservare. Tuttavia, se avrò un widget e osserva che, quindi assegnare l'oggetto proxy aNewWidget, non osserva ancora le modifiche a meno che non aggiungendo l'osservatore dopo l'assegnazione (e ovviamente la creazione di una necessità di rimuovere l'osservatore su un cambio di oggetto).

Inoltre, cosa succede in questo scenario se aNewWidget viene distrutto? Poiché l'osservatore è sul proxy, questo nega la necessità di rimuovere l'osservatore prima di distruggere l'oggetto? (Presumo che non lo faccia).

Idealmente mi piacerebbe essere in grado di impostare l'osservatore sul proxy e scambiare dentro e fuori qualsiasi riferimento di widget Voglio l'oggetto proxy senza dover preoccupare di aggiungere e rimuovere l'osservatore a meno che la classe MyController Caso Potrei gestire la rimozione dell'osservatore nel dealloc.

Qualsiasi aiuto / commenti / consigli apprezzati.

È stato utile?

Soluzione

Il keyPath deve essere conforme a KVC.Quindi ecco il codice:

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

Non dimenticare di sintetizzarlo nel file di implementazione.Quindi usa questo codice per aggiungere l'osservatore:

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

Controlla la mia modifica.Ho cambiato l'assegnazione da conservare.Forse è meglio per te.Dovresti provare a scegliere il meglio per te.Voglio solo dire che non importa in KVO.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top