Наблюдение за объектом с использованием прокси-объекта
-
29-10-2019 - |
Вопрос
Должен ли я иметь возможность настроить наблюдателя на прокси-объекте, изменить то, на что указывает прокси-объект, и при этом иметь возможность наблюдать изменения на реальном объекте?
Лучше всего это можно объяснить на примере.Рассмотрим следующее.
В заголовке:
@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
класс исчезнет, и в этом случае я мог бы выполнить удаление наблюдателя в файле Dealloc.
Любая помощь/комментарии/советы приветствуются.
Решение
KeyPath должен быть совместимым с KVC.Итак, вот код:
@interface MyController : NSObject {
MyWidgetModel * aProxyObject;
}
@property (nonatomic, retain) MyWidgetModel * aProxyObject;
Не забудьте синтезировать его в файле реализации.Затем используйте этот код, чтобы добавить наблюдателя:
[self addObserver:self
forKeyPath:@"aProxyObject"
options:NSKeyValueObservingOptionNew
context:nil];
Пожалуйста, проверьте мое редактирование.Я изменил назначение, чтобы сохранить.Может быть, это лучше для вас.Вы должны постараться выбрать для себя лучшее.Я просто хочу сказать, что в КВО это не имеет значения.