2012-10-04 80 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

相關問題