我在我的精灵工具包应用程序中遇到问题,我的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:之后,它将返回内存中的值(如果存在),如果不存在,它会去寻找什么被保存到长期存储.
在后台,设备最终会将这些值保存到永久存储中.它是操作系统处理的东西,但是在应用程序的正常操作中,大多数时候没有必要立即将这些值存储到永久存储器中,所以让操作系统有时会在优化时执行此操作(I想象一下,操作系统可能会在一些固定的时间表上同时同步每个应用程序的用户默认值,并且尽可能在处理器闲置时尝试执行此操作.
但就是说,正如rmaddy解释的那样,如果你有一些关键的东西需要立即保存到永久存储器中,你可以随时调用同步.请记住……只要您的应用程序在调试模式下没有被杀死,您将设置存储在用户默认值中的值.
但是为了你自己,如果你想要绝对肯定,你可以调用它来在applicationDidEnterBackground中进行同步,正如rmaddy建议的那样.但请记住,如果您终止应用程序,则不会调用此方法.