Наблюдение за объектом с использованием прокси-объекта - PullRequest
0 голосов
/ 04 февраля 2011

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

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

В шапке:

@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.

Любая помощь / комментарии / советы приветствуются.

1 Ответ

0 голосов
/ 04 февраля 2011

KeyPath должен соответствовать KVC. Итак, вот код:

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

Не забудьте синтезировать его в файле реализации. Затем используйте этот код, чтобы добавить наблюдателя:

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

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

...