【问题标题】:Objective-C NSUserDefaults caching prevents another app from accurately reading changesObjective-C NSUserDefaults 缓存阻止另一个应用程序准确读取更改
【发布时间】:2012-05-19 18:29:33
【问题描述】:

我有一个设置偏好的应用程序。它使用这些首选项,另一个应用程序也是如此。当我在第二个应用程序中使用以下代码时,它会正确读取一次首选项。

    NSUserDefaults* settings = [NSUserDefaults standardUserDefaults];
    [settings addSuiteNamed:@"com.WVS.Wrestling-Tools"];
    [settings synchronize]; // this just a shot in the dark.. didn't work

    [self setScoreboardIndex:[settings integerForKey:@"matName"]];

在随后调用相同代码时,我得到 [settings integerForKey:@"matName"] 始终是第一次读取的值。

在第一个应用程序中,我使用共享用户默认控制器来读取/写入首选项。不确定这对这个问题是否重要。

如何强制第二个应用程序始终获取最新值?

【问题讨论】:

    标签: objective-c nsuserdefaults preferences


    【解决方案1】:

    您应该能够在第二个程序中调用+[NSUserDefaults resetStandardUserDefaults] 来强制+[NSUserDefaults standardUserDefaults] 创建一个新实例并在下次调用它时从磁盘重新加载值。在 first 程序中调用 -synchronize 是确保将更新的默认值写入磁盘的正确方法(我不确定 NSUserDefaultsController 在这方面的行为如何)。

    请注意,每次访问 standardUserDefaults 时调用 +[NSUserDefaults resetStandardUserDefaults] 如果您频繁调用可能会导致性能下降,因为这可能意味着每次读取都会命中磁盘。

    【讨论】:

    • 做到了。我将同步添加到第一个程序中,以便它仅在需要时执行,这很少见。谢谢!
    • synchronize 既可读又可写,因此在第二个程序中使用它也会导致新值被拾取。不过,我不确定这是否会比resetStandardUserDefaults 更好——我认为唯一的区别是不会创建新的NSUserDefaults 对象。
    • 不适合我。当我同步默认值时,通过 Xcode 更改我的 plists 内容,然后调用 resetStandardUserDefaults 它会恢复到预编辑状态...
    • @Julian,OS X 中的首选项系统最近发生了变化(在 10.9,IIRC 中),现在进行了更积极的缓存。手动编辑首选项 plist 不再可靠。相反,您应该只通过NSUserDefaults(或CFPreferences)API 或使用defaults 命令行工具进行更改。
    • @AndrewMadsen:当然,这很简单。但是在开发过程中,有时能够像全新安装一样擦除首选项很有用。因此缓存杀戮将非常有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多