Objekt mit Proxy-Objekt beobachten
-
29-10-2019 - |
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.
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.