4

とても簡単な質問ですが、答えが見つからないようです。(iOS 5以降のアプリの開発)。

私のAppDelegateには、プロパティがあります。これを呼び出しましょう@property (non atomic) BOOL aFlag;。値が変更された場合にAppDelegateに通知を受け取りたいのですが。これが私が試したものです(すべてがで発生しますAppDelegate.m)。これは、2つの異なるオブジェクトをオブザーバーで「リンク」した場合と同じです。

-(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

独自のセッターを実装する必要があります。そのセッターでは、ポパティが変わったことを知っています。

そのように最適化されています。自分で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];
}
于 2012-10-04T16:50:36.420 に答える