一个很简单的问题,但我似乎找不到答案。 (开发 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:
没有被调用。
我哪里错了?谢谢。
最佳答案
您应该实现自己的二传手。在那个 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];
}
关于ios - 自己添加观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12728141/