NSUserDefaults,不可靠?

时间:2012-11-21 22:21:15

标签: objective-c nsuserdefaults

我正在开发一个学习obj-c的项目,它通过构建一个与PHP / MySQL api对话的小应用程序来学习。

每次用户执行某项操作时,都会为此用户设置新的身份验证密钥并将其发送到客户端。客户端收到此值并应将其设置为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)我尝试登录用户,值设置(如“aaaaaaaaaaaaaaa”),一切都很好。我重新启动程序,它获取此存储的值,尝试登录,从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 ...”,对吗?错误!当我现在NSLog这个值时,它仍然是“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 个答案:

答案 0 :(得分:4)

设置值时,

NSUserDefaults不会将更改写入文件。它会定期,偶尔这样做。如果您希望它立即将更改保留到磁盘,您应该同步它:

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