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

StackOverflow https://stackoverflow.com/questions/4901692

Вопрос

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

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

В заголовке:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top