Наблюдение за объектом с использованием прокси-объекта
Должен ли я иметь возможность настроить наблюдателя на прокси-объекте, изменить то, на что указывает прокси-объект, и при этом иметь возможность наблюдать изменения на реальном объекте?
Пример может объяснить это лучше всего. Учтите следующее.
В шапке:
@interface MyController : NSObject {
MyWidgetModel * aProxyObject;
}
В инициализации или в пробуждении от метода NIB:
-(void)awakeFromNib {
// Init the proxy object. Could be as an empty widget
[aProxyObject addObserver:self
forKeyPath:@"widgetName"
options:NSKeyValueObservingOptionNew
context:nil];
}
Какой-то другой метод, который изменяет объект:
-(void)changeWidget:(MyWidgetModel *)aNewWidget {
aProxyObject = aNewWidget;
}
Это не вызывает никаких изменений в aNewWidget
, Тем не менее, если я переместить addObserver
чтобы после присвоения выполнить следующее:
-(void)changeWidget:(MyWidgetModel *)aNewWidget {
[aProxyObject removeObserver:self forKeyPath:@"widgetName"];
aProxyObject = aNewWidget;
[aProxyObject addObserver:self
forKeyPath:@"widgetName"
options:NSKeyValueObservingOptionNew
context:nil];
}
Я предполагаю, что первый случай не работает, потому что наблюдатель наблюдает указатель памяти ссылки на прокси-объект, и, поскольку в момент добавления прокси-наблюдателя нет объекта, ему нечего наблюдать. Однако, если я инициализирую виджет и наблюдаю это, тогда назначаю объект прокси aNewWidget
он все еще не наблюдает изменений, если я не добавлю наблюдателя после назначения (и, конечно, создаю необходимость удалить наблюдателя при смене объекта).
Кроме того, что происходит в этом сценарии, если aNewWidget
разрушается? Поскольку наблюдатель находится на прокси-сервере, отменяет ли это необходимость удаления наблюдателя перед уничтожением объекта? (Я предполагаю, что это не так).
В идеале я хотел бы иметь возможность установить наблюдателя на прокси-сервер и поменять местами любую ссылку на виджет, которую я хочу, на объект прокси, не беспокоясь о добавлении и удалении наблюдателя, если только MyController
класс исчезает, и в этом случае я могу обработать удаление наблюдателя в Deloc.
Любая помощь / комментарии / советы приветствуются.
1 ответ
KeyPath должен соответствовать KVC. Итак, вот код:
@interface MyController : NSObject {
MyWidgetModel * aProxyObject;
}
@property (nonatomic, retain) MyWidgetModel * aProxyObject;
Не забудьте синтезировать его в файле реализации. Затем используйте этот код, чтобы добавить наблюдателя:
[self addObserver:self
forKeyPath:@"aProxyObject"
options:NSKeyValueObservingOptionNew
context:nil];
Пожалуйста, проверьте мои изменения. Я изменил назначение, чтобы сохранить. Может быть, это лучше для вас. Вы должны попытаться выбрать лучшее для вас. Я просто хочу сказать, что это не имеет значения в КВО.