Наблюдение за объектом с использованием прокси-объекта

Должен ли я иметь возможность настроить наблюдателя на прокси-объекте, изменить то, на что указывает прокси-объект, и при этом иметь возможность наблюдать изменения на реальном объекте?

Пример может объяснить это лучше всего. Учтите следующее.

В шапке:

@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];

Пожалуйста, проверьте мои изменения. Я изменил назначение, чтобы сохранить. Может быть, это лучше для вас. Вы должны попытаться выбрать лучшее для вас. Я просто хочу сказать, что это не имеет значения в КВО.

Другие вопросы по тегам