NSUserDefaults,不可靠?
Posted
技术标签:
【中文标题】NSUserDefaults,不可靠?【英文标题】:NSUserDefaults, not reliable? 【发布时间】:2012-11-21 22:21:15 【问题描述】:我正在通过构建一个与 php/mysql api 对话的小型应用程序来学习 obj-c 的项目。
每次用户做某事时,都会为该用户设置一个新的 auth-key 并发送给客户端。客户端接收到这个值并且应该将它设置为 NSUserDefaults。这是为了在每次程序启动时都不让用户登录;如果此密钥存在,它将尝试使用此密钥进行身份验证,然后自动登录。
这有时会起作用...我有两个功能,一个用于接收,一个用于设置。它们看起来像这样:
//GET
-(NSString*)GetValue:(NSString *)Name
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *get = [prefs stringForKey:Name];
if(get)
return get;
else
return FALSE;
//SET
-(void)SetValue:(NSString*)Name:(NSString*)Value
//Add new...
[[NSUserDefaults standardUserDefaults] setObject:Value forKey:Name];
这几乎可行。 问题是这样的:
1) 未设置 auth-key 值(在 NSUserDefaults 中) 2)我尝试登录用户,值集(如“aaaaaaaaaaaaaaaa”),一切都很好。我重新启动程序,它使用这个存储的值,尝试登录,从 PHP 中得到一个肯定的结果以及一个新的密钥,当答案返回时必须设置一个新的密钥......就像这样......
if(NewKey.length > 0)
NSLog(@"TRY SET KEY: %@", NewKey);
[self SetValue:@"auth_key":NewKey];
NSLog(@"TRY GET KEY: %@", [self GetValue:@"auth_key"]);
3) 上面的 NSLog 显示“TRY SET KEY: bbbbbbbbbbbbbbbb”和“TRY GET KEY: bbbbbbbbbbbbbbbb”。看起来很完美! 4) 好吧,我杀了程序再试一次,现在它应该已经存储了“bbb...”,对吧?错误的!当我现在 NSLogs 这个值时,它仍然是“aaa ...” 5) 我再次尝试登录,NSLog 显示“TRY SET KEY: ccc ...”和“TRY GET KEY: ccc ...” - 它说这个值已存储。但这不是... 6)我杀死程序,重新启动并得到“aaa ...”。 7)我杀死程序,在AppDelegate中我手动设置这个值(具有相同的功能)喜欢“xxx”。我运行该程序,它将密钥设置为“xx”之类的东西。我删除了这一行,重新启动程序,“xxx”被正确存储,现在我又回到了#2;我可以进行一次登录,它会正确存储此值,然后我可以进行一次自动登录,但在该登录时它会停止保存它...
那么,这里有什么问题?我尝试将 [[NSUserDefaults standardUserDefaults] removeObjectForKey:Name];
作为 SetValue 的第一行,但没有帮助。
它就像是固定的,然后无论如何都被遗忘了......我做错了什么?
【问题讨论】:
【参考方案1】:NSUserDefaults
在您设置值时不会将更改写入文件。它会定期这样做,偶尔一次。如果您希望它立即将更改持久保存到磁盘,您应该同步它:
[[NSUserDefaults standardUserDefaults] setObject:Value forKey:Name];
[[NSUserDefaults standardUserDefaults] synchronize];
【讨论】:
@gubbfett 没问题。然后,当您能够这样做时,请接受我的回答。 (提示:顺便说一句,谷歌搜索一下就会提出这个解决方案......) 我认为这通常是在您的应用程序正常退出时为您完成的。如果您强制应用退出或崩溃,它可能永远不会同步。我猜在你的测试中,你没有优雅地停止应用程序。在现实世界中,这不是问题。 @AlexWayne 不幸的是,我对此有一些不好的经历。行为可能会随着时间的推移而改变,但上次我检查时,同步并不总是在退出时完成(并且不是因为应用程序崩溃了)。 @AlexWayne,不...我也尝试在应用程序上做一个不错的杀戮,因为我期待这样的事情,但它给出了相同的结果... 非常感谢,我一直在努力解决 NSUserDefaults 的非常奇怪的行为,它没有读取保存的数据,这就是诀窍。为此 +1 :-)以上是关于NSUserDefaults,不可靠?的主要内容,如果未能解决你的问题,请参考以下文章