У меня есть класс «Компас», который предназначен для наблюдения за другим классом «SensorA», «SensorB» или «SensorC». Проблема в том, что я не знаю наблюдаемого класса до времени выполнения. Я использовал отражения, чтобы создать экземпляр во время выполнения. Я не знаю, правильно ли я практикую KVO, когда занимаюсь этим.
---Another Extern Class--- Compass *aCompass= [[AnalogCompass alloc] initWithCompassName:@"ABC" andID...]; ---The oberserving Compass.m Class--- - (id)initWithCompassName:(NSString *)CompassName andIid:(int)Iid showAnalog:(NSString *)ShowAnalog showDigital:(NSString *)ShowDigital { if (self = [super init]) { super.iid = Iid; super.CompassName = CompassName; showAnalog=ShowAnalog; showDigital=ShowDigital; Class unknown_cls; unknown_cls = [[NSClassFromString(super.CompassName) alloc]init]; [unknown_cls addObserver:self forKeyPath:showAnalog options:NSKeyValueObservingOptionNew context:NULL]; [unknown_cls addObserver:self forKeyPath:showDigital options:NSKeyValueObservingOptionNew context:NULL]; } } - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ NSLog(@"IN?"); // [super observeValueForKeyPath:keyPath // // ofObject:object // // change:change // // context:context]; } ---Example of the oberserved SensorA Class--- @interface SensorA : NSObject { double xPosition; ... } @property (assign) double depthInFeet; - (id)initWithLineToParse:(NSArray *) fields; @end
When I´m doing a change like self.xposition = position; in any of my observed and reflected Sensor Classes (SensorA,SensorB,SensorC), the "observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context" in my observer Compass ist not called. Im guessing it has something to do with the reflection and maybe with related restrictions of this kind of technique. Or maybe because reflecting with
unknown_cls = [[NSClassFromString(super.CompassName) alloc]init];and not with
unknown_cls = [[NSClassFromString(super.CompassName) alloc]initWithLineToParse:array];
Как заставить это работать для меня? Может быть, это неправильная попытка такого наблюдения? Спасибо за помощь.