2012-11-21 69 views
0

我正在通過構建一個適用於PHP/MySQL API的小應用程序來學習obj-c的項目。NSUserDefaults,不可靠?

每次用戶執行某項操作時,都會爲該用戶設置一個新的授權密鑰併發送給客戶端。客戶端收到此值並將其設置爲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)(在NSUserDefaults的)
2)我嘗試登錄的用戶,值集(如「aaaaaaaaaaaaaaaa」)中的auth-鍵值沒有設置和一切都很好。我重新啓動程序,它需要這個存儲的值,嘗試登錄,從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的第一行,但它沒有幫助。

這就像它設置,然後beeing無論如何被遺忘......我做錯了什麼?

回答

4

NSUserDefaults在設置值時不會將更改寫入文件。它會定期這樣做,偶爾會發生。如果您希望它立即堅持更改到磁盤,您應該同步它:

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

這樣做的竅門!謝謝! – gubbfett

+0

@gubbfett沒問題。請儘可能接受我的答案。 (提示:btw有點谷歌會提出這個解決方案......) – 2012-11-21 22:28:51

+0

我認爲這通常是爲你完成的,當你的應用程序正常退出。如果您強制應用程序退出,或者它崩潰,它可能永遠不會同步。我在測試中猜測,你沒有優雅地停止應用程序。在現實世界中,這不是一個問題。 –