【问题标题】:NSUserDefaults, not reliable?NSUserDefaults,不可靠?
【发布时间】: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 的第一行,但没有帮助。

它就像是固定的,然后无论如何都被遗忘了......我做错了什么?

【问题讨论】:

    标签: objective-c nsuserdefaults


    【解决方案1】:

    NSUserDefaults 在您设置值时不会将更改写入文件。它会定期这样做,偶尔一次。如果您希望它立即将更改持久保存到磁盘,您应该同步它:

    [[NSUserDefaults standardUserDefaults] setObject:Value forKey:Name];
    [[NSUserDefaults standardUserDefaults] synchronize];
    

    【讨论】:

    • @gubbfett 没问题。然后,当您能够这样做时,请接受我的回答。 (提示:顺便说一句,谷歌搜索一下就会提出这个解决方案......)
    • 我认为这通常是在您的应用程序正常退出时为您完成的。如果您强制应用退出或崩溃,它可能永远不会同步。我猜在你的测试中,你没有优雅地停止应用程序。在现实世界中,这不是问题。
    • @AlexWayne 不幸的是,我对此有一些不好的经历。行为可能会随着时间的推移而改变,但上次我检查时,同步并不总是在退出时完成(并且不是因为应用程序崩溃了)。
    • @AlexWayne,不...我也尝试在应用程序上做一个不错的杀戮,因为我期待这样的事情,但它给出了相同的结果...
    • 非常感谢,我一直在努力解决 NSUserDefaults 的非常奇怪的行为,它没有读取保存的数据,这就是诀窍。为此 +1 :-)
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    相关资源
    最近更新 更多