Frage

Sollte ich in der Lage sein, einen Beobachter für ein Proxy-Objekt einzurichten, zu ändern, worauf das Proxy-Objekt zeigt, und trotzdem Änderungen am realen Objekt beobachten zu können?

Ein Beispiel könnte dies am besten erklären.Betrachten Sie Folgendes.

In der Kopfzeile:

@interface MyController : NSObject {   

  MyWidgetModel * aProxyObject;

}

In einer Initialisierungs- oder Awake-from-NIB-Methode:

-(void)awakeFromNib {

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

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

}

Eine andere Methode, die das Objekt ändert:

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

  aProxyObject = aNewWidget;

}

Dies löst keine Änderungen in aus aNewWidget.Wenn ich jedoch die bewege addObserver nach der Zuweisung wie folgt funktioniert es:

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

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

   aProxyObject = aNewWidget;

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

Ich gehe davon aus, dass der erste Fall nicht funktioniert, weil der Beobachter den Speicherzeiger der Referenz des Proxy-Objekts beobachtet und da zum Zeitpunkt des Hinzufügens des Proxy-Beobachters kein Objekt vorhanden ist, nichts zu beobachten ist.Wenn ich jedoch ein Widget initiiere und dies beobachte, weisen Sie das Proxy-Objekt zu aNewWidget änderungen werden immer noch nicht beobachtet, es sei denn, ich füge den Beobachter nach der Zuweisung hinzu (und es besteht natürlich die Notwendigkeit, den Beobachter bei einer Objektänderung zu entfernen).

Was passiert in diesem Szenario auch, wenn aNewWidget zerstört wird?Macht dies die Notwendigkeit zunichte, den Beobachter zu entfernen, bevor das Objekt zerstört wird, da sich der Beobachter auf dem Proxy befindet?(Ich nehme an, das tut es nicht).

Idealerweise möchte ich in der Lage sein, den Beobachter auf den Proxy zu setzen und die gewünschte Widget-Referenz auf das Proxy-Objekt ein- und auszuwechseln, ohne mich um das Hinzufügen und Entfernen des Beobachters kümmern zu müssen, es sei denn, die MyController die Klasse geht weg, in diesem Fall könnte ich die Entfernung des Beobachters in der Freigabe erledigen.

Jede Hilfe / Kommentare / Ratschläge geschätzt.

War es hilfreich?

Lösung

Der Schlüsselpfad muss KVC-kompatibel sein.Also hier ist der Code:

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

Vergessen Sie nicht, es in der Implementierungsdatei zu synthetisieren.Verwenden Sie dann diesen Code, um den Beobachter hinzuzufügen:

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

Bitte überprüfen Sie meine Bearbeitung.Ich habe die Zuordnung zu behalten geändert.Vielleicht ist es besser für dich.Sie sollten versuchen, das Beste für Sie auszuwählen.Ich möchte nur sagen, dass es in KVO keine Rolle spielt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top