【问题标题】:Can KVO be used to observe a global variable?KVO可以用来观察全局变量吗?
【发布时间】:2013-02-16 13:41:43
【问题描述】:

我有一个全局变量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];
    }
}

但这没有被调用。

【问题讨论】:

    标签: objective-c cocoa-touch key-value-observing


    【解决方案1】:

    您不能为全局变量添加观察者,KVO 仅适用于对象的属性。您可以将全局变量包装在应用程序委托上的 getter/setter 对中,但您也可以使用常规属性,因为只有使用 setter 的更改才会触发 KVO 通知。

    此外,您无论如何都不应该使用全局变量,即使您将它们伪装成“单例”也不行。

    【讨论】:

    • 同意,OOP 中的全局变量很糟糕。
    • 谢谢你的回答,我会重新设计的。
    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2019-02-16
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多