2015-11-13 102 views
1

我在NSUserDefaults中將用戶的用戶配置文件圖片ID保存爲字符串,例如: @ 「12」。當我這樣做時,我立即調用同步方法。NSUserDefaults有時會返回錯誤的值

當我從NSUserDefaults中讀取此值時,它可能會在99%的時間內返回@「12」。但有時候,它會返回一個不同的值(由於事件的稀少性,我找不到這個值),但是懷疑它是零或者是某個默認值(?))。

我用寫的代碼/讀取很簡單:

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; 
[userDefaults setObject:@"12" forKey:@"photoID"]; 
[userDefaults synchronize]; 

NSString* photoID=[userDefaults objectForKey:@"photoID"]; 

我知道有時返回的值不正確,因爲在當時的應用程序的行爲如同值不同(即用戶的聯繫人通知個人資料圖片已更改)。

發生這種情況時,下一次調用objectForKey將返回正確的值,因此用戶聯繫人會收到另一個通知,該配置文件圖片已再次發生更改。

+0

我只需要在更改默認值時調用同步,這並不常見,所以不用擔心。我懷疑刪除它會改變什麼,問題是需要幾天才能找出錯誤是否再次發生。我希望聽到某個面臨類似問題的人的意見,即事情工作正常的99%以上,但有時不會。 – Georges

+0

不是所有的錯誤都可以很容易地重現。如果我知道行爲或情況,我可能會修復這個錯誤。而我正在尋找的是一個經歷過這個問題的人。我願意嘗試,但我很確定調用同步不會導致錯誤。 – Georges

+0

我想你是對的......足夠公平。 – Georges

回答

2

NSSynchronize不保證成功並返回BOOL。 請注意,syncrhonize只是將數據寫入磁盤,但NSUserDefaults也將數據保存在內存中。在每次寫入之後調用它可能不是必需的,儘管我自己做過,並且網絡上的許多示例都是這樣做的。

從Apple文檔:

使用此方法僅如果你不能等待自動同步(例如,如果你的應用程序即將退出),或者如果您想更新用戶的默認值是什麼即使您未做任何更改,也是在磁盤上。

聲明:推測
失敗的同步操作可能導致objectForKey失敗。該類知道它可能有錯的數據,因此返回nil。如果您調用連續或過度同步或以其他方式執行IO密集型操作,則更有可能發生這種情況。

+0

非常感謝,這聽起來很合理。儘管應用程序不會經常同步調用(所以我不確定這是由於此原因),但很明顯get方法在罕見時間點失敗。我剛剛與用戶覈對過,看起來他確實在事件發生前不久對其他設置進行了一些更改(因此調用了Synchronize)。我猜這只是一個運氣不好的情況。無論如何,我現在要檢查get方法返回nil,只是想知道爲什麼以及發生這種情況的頻率。顯然這是非常罕見的,因爲我試圖重現,但不能.. – Georges