rdu*_*and 4 objective-c self key-value-observing addobserver ios
一个非常简单的问题,但我似乎无法找到答案.(开发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
}
}
Run Code Online (Sandbox Code Playgroud)
但是observeValueForKeyPath:不叫.
我哪里错了?谢谢.
Dan*_*iel 11
你应该实现自己的setter.在那个二传手中,你知道这个人物已经改变了.
它以这种方式进行了更优化.比你自己做KVO好多了,便宜得多.
您的解决方案有效,从技术上讲,您可以自己KVO.
但是,想象一下,如果你开始NSNotificationCenter在课堂上使用触发方法吗?可以吗?是.应该是吗?可能不是.您可能有一个可以正常但不适合干净的面向对象解决方案的场景.你应该self为此发消息.
嗯,这里也一样.实现这个:
- (void)setAFlag:(BOOL)flag;
Run Code Online (Sandbox Code Playgroud)
例如:
- (void)setAFlag:(BOOL)flag{
BOOL valueChanged = NO;
if(_aFlag != flag){
valueChanged = YES;
}
_aFlag = flag;
if(valueChanged)
[self doSomethingWithTheNewValueOfFlag];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5041 次 |
| 最近记录: |