5

User * currentUser;任意のクラスから変更される可能性のあるグローバル変数 があります。変更時に保存したいNSUserDefaults

このようなグローバル変数に KVO を使用することは可能ですか、または同様の効果を達成する他の方法はありますか?

アプリデリゲートをオブザーバーとして追加しましたcurrentUser

 [self addObserver:self forKeyPath:@"currentUser" options:NSKeyValueObservingOptionNew context:nil];

--

-(void)observeValueForKeyPath:(NSString *)keyPath
                     ofObject:(id)object
                       change:(NSDictionary *)change
                      context:(void *)context
{
    if ([keyPath isEqualToString:@"currentUser"])
    { 
        NSDictionary * userDict = [currentUser dictionaryRepresantation];

        [UserDefaults setObject:userDict forKey:@"USER_DATA"];
        [UserDefaults synchronize];
    }
}

しかし、これは呼び出されません。

4

1 に答える 1

3

グローバル変数のオブザーバーを追加することはできません。KVOはオブジェクトのプロパティでのみ機能します。アプリデリゲートのゲッター/セッターペア内にグローバル変数をラップすることもできますが、セッターを使用した変更のみがKVO通知を発行するため、通常のプロパティを使用することもできます。

また、グローバル変数を「シングルトン」に偽装した場合でも、グローバル変数を使用しないでください。

于 2013-02-16T13:46:01.010 に答える