4

一个非常简单的问题,但我似乎找不到答案。(开发 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:不叫。

我哪里错了?谢谢。

4

1 回答 1

11

您应该实现自己的设置器。在那个二传手你知道poperty已经改变了。

这种方式更加优化。比自己做 KVO 好得多,也便宜得多。

您的解决方案有效,从技术上讲,您可以自己进行 KVO。

但是,想象一下,如果你开始NSNotificationCenter在你的班级中使用 for 触发方法?可以做到吗?是的。应该是吗?可能不是。您可能会遇到这样的情况,但在干净的面向对象解决方案中却不行。您应该self为此发送消息。

好吧,这里也一样。实现这个:

- (void)setAFlag:(BOOL)flag;

例如:

- (void)setAFlag:(BOOL)flag{
    BOOL valueChanged = NO;    

    if(_aFlag != flag){
       valueChanged = YES;
    }
    _aFlag = flag;

    if(valueChanged)
        [self doSomethingWithTheNewValueOfFlag];
}
于 2012-10-04T16:50:36.420 回答