ios - NSUserDefaults 不保存

标签 ios nsuserdefaults sprite-kit

我的 sprite 工具包应用程序出现问题,我的 NSUserDefaults 变量无法正常工作。在 createSceneContents(我知道它被调用)

if (![defaults objectForKey:@"obj"]) {
    difficultyLabel.text = @"Difficulty: Easy";
    [defaults setObject:@"Easy" forKey:@"obj"];
} else {
    difficultyLabel.text = [NSString stringWithFormat:@"Difficulty: %@", [defaults objectForKey:@"diff"]];
}

然后当你点击SKLabelNode改变难度时,这段代码被调用

if ([label.text isEqualToString:@"Difficulty: Easy"]) {
            label.text = @"Difficulty: Hard";
            [defaults setObject:@"Hard" forKey:@"obj"];
            NSLog(@"%@",[defaults objectForKey:@"obj"]);

        } else {
            label.text = @"Difficulty: Easy";
            [defaults setObject:@"Easy" forKey:@"obj"];
            NSLog(@"%@",[defaults objectForKey:@"obj"]);

但是当我停止程序并再次运行时,它总是只显示难度:简单。有什么建议吗?

最佳答案

正如 rmaddy 的回答所解释的那样,NSUserDefaults不会立即将数据写入长期存储。

当您调用 setObject:forKey: 时,这些值会保存在临时内存中, 所以如果你试图调用 objectForKey:setObject:forKey: 之后,如果内存中存在,它会返回内存中的值,如果不存在,它会去寻找保存到长期存储中的内容。

在后台,设备最终会将这些值保存到永久存储中。这是操作系统处理的事情,但在你的应用程序的正常运行中,大多数时候不需要立即将这些值存储到永久存储中,所以让操作系统在优化时这样做(我想象操作系统可能会定期同步每个应用程序的用户默认设置,并尽可能在处理器空闲时尝试执行此操作。

但是话虽如此,正如 rmaddy 解释的那样,如果您有非常重要的东西需要立即保存到永久存储中,您可以随时调用 synchronize .不过请记住……只要您的应用程序在 Debug模式下没有被终止,您设置为存储在用户默认值中的值就会被存储。

但是为了您自己,如果您想绝对确定,可以调用 synchronizeapplicationDidEnterBackground正如rmaddy建议的那样。但请记住,如果您终止应用程序,则不会调用此方法。

关于ios - NSUserDefaults 不保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21868315/

相关文章:

android - 如何使用 Google Analytics(应用程序和网络)进行统一跟踪

适用于 iOS 的 Facebook API,获取 friend 的个人资料图片

iphone - NSString 比较不起作用

ios - Vue.js v-on :submit (@submit) not working on iPhone/iPad

ios - 使用 NSMutableArray 将变异方法发送到不可变对象(immutable对象)

ios8 - 为什么 [NSSet containsObject] 在 iOS8 中对 SKNode 成员失败?

swift - 他们是否对哪个 body 是 body 和 body 什么时候开始做出任何保证(_ :) is called?

ios - 如何检查用户字典中的键是否更改?

ios - 是否可以使用 settings.bundle 在应用程序内显示首选项?

swift - 使用 spriteKit 动画后恢复第一张图片