2012-10-04 28 views
4

一个非常简单的问题,但我似乎无法找到答案。 (开发iOS 5+应用程序)。addObserver on

在我的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:不叫。

我在哪里错了?谢谢。

回答

10

你应该实现你自己的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]; 
} 
+1

嗯,这是一个很好的答案。我没有想到,看起来比KVO解决方案更有效率。唯一的是我有五个标志可以观察......这意味着我需要实现5个setter,或者使用所有标志的单一方法(可能更好)。感谢您的建议 ! – rdurand

+0

这是一个很棒的回答布尔在布尔 – ewizard

相关问题