2012-05-19 61 views
2

我有一個應用程序可以設置首選項。它使用這些首選項,另一個應用程序也是如此。當我在第二個應用程序中使用以下代碼時,它會正確讀取一次首選項。Objective-C NSUserDefaults緩存可防止其他應用程序準確讀取更改

NSUserDefaults* settings = [NSUserDefaults standardUserDefaults]; 
    [settings addSuiteNamed:@"com.WVS.Wrestling-Tools"]; 
    [settings synchronize]; // this just a shot in the dark.. didn't work 

    [self setScoreboardIndex:[settings integerForKey:@"matName"]]; 

相同的代碼的後續調用,我得到的[設置integerForKey:@「matName」]總是那是第一次讀值。

在第一個應用程序中,我使用共享用戶默認值控制器來讀取/寫入首選項。不知道這個問題是否重要。

如何強制第二個應用程序始終獲取最新值?

回答

4

您應該可以在第二個程序中調用+[NSUserDefaults resetStandardUserDefaults]強制+[NSUserDefaults standardUserDefaults]創建一個新實例並在下次調用磁盤時重新加載值。在中調用-synchronize第一個程序是確保將更新後的默認值寫入磁盤的正確方法(我不確定NSUserDefaultsController在這方面的表現如何)。

請注意,每次訪問standardUserDefaults時調用+[NSUserDefaults resetStandardUserDefaults]可能會導致性能損失(如果頻繁這樣做),因爲它可能意味着每次讀取時都會有一個磁盤命中。

+0

這樣做。我將同步添加到第一個程序,以便它只在需要時執行,這很少。謝謝! – Adam

+1

'synchronize'既是讀取又是寫入,因此在第二個程序中使用同步會導致新值被拾取。我不確定這是否會比'resetStandardUserDefaults'好,但我認爲唯一的區別不是創建一個新的'NSUserDefaults'對象。 –

+0

不適合我。當我同步默認值時,通過Xcode更改我的plists內容,然後調用'resetStandardUserDefaults',它將恢復到預編輯的狀態...... –

相關問題