一个非常简单的问题,但我似乎无法找到答案。 (开发iOS 5+应用程序)。
在我的 AppDelegate 中,我有一个属性,我们称之为@property (non atomic) BOOL aFlag;
。如果值发生变化,我希望通知我的 AppDelegate 。这是我尝试过的(一切都发生在AppDelegate.m
),这与我用观察者“链接”两个不同的对象时相同:
-(BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
// Some stuff
_aFlag = YES;
[self addObserver:self
forKeyPath:@"aFlag"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:nil];
// Some other stuff
}
-(void)observeValueForKeyPath:(NSString*)keyPath
ofObject:(id)object
change:(NSDictionary*)change
context:(void*)context {
if ([keyPath isEqual:@"aFlag"]) {
// Do something
} else {
// Do nothing
}
}
但observeValueForKeyPath:
未被调用。
我哪里错了?感谢。
答案 0 :(得分:11)
您应该实现自己的setter。在那个二传手中,你知道这个人物已经改变了。
这种方式更加优化。比你自己做KVO好多了,便宜得多。
您的解决方案有效,从技术上讲,您可以自己KVO。
但是,想象一下,如果你开始使用NSNotificationCenter
从你的班级内部触发你班级的方法?可以吗?是。应该是吗?可能不是。您可能有一个可以正常但不适合干净的面向对象解决方案的场景。您应该为此发送消息self
。
嗯,这里也一样。实现这个:
- (void)setAFlag:(BOOL)flag;
例如:
- (void)setAFlag:(BOOL)flag{
BOOL valueChanged = NO;
if(_aFlag != flag){
valueChanged = YES;
}
_aFlag = flag;
if(valueChanged)
[self doSomethingWithTheNewValueOfFlag];
}