2010-07-07 24 views
9

我正在開發一個iPhone應用程序,由於多任務,我在iOS4上遇到問題。如何獲取iOS 4上的更新NSUserDefault?

此應用程序具有在Settings.bundle中定義的默認設置。 如果我運行我的應用程序,然後我離開它(所以它在後臺)。 我將更改設置並重新啓動應用程序(它來自待機和方法:applicationDidBecomeActive()被調用)。

NSUserDefault中的值不是更新,而是當我離開應用程序並重新啓動時。值很好。

有人遇到同樣的問題嗎? 我做錯了什麼?

謝謝你的建議/幫助。

+0

當您的應用再次變爲活動狀態時,您是否刷新默認值?如果你不是,那麼你應該在後臺改變它們。 – iwasrobbed 2010-07-07 13:48:04

回答

20

我有同樣的問題,因爲你和它周圍有由applicationDidBecomeActive調用

[[NSUserDefaults standardUserDefaults] synchronize]; 

由於某些原因,在應用程序被暫停後再次變爲活動狀態時,您可以在應用程序中訪問的對象[NSUserDefaults standardUserDefaults]與支持它的實際plist文件不同步。調用synchronize方法強制進行同步。

+0

需要強調的是,如果要將這些更改寫入文件,則必須在更改NSUserDefaults後調用synchronize。如果你不這樣做,這些改變將只存儲在內存中。 – Goles 2010-07-21 17:08:20

+1

@ Mr.Gando事實並非如此。 'NSUserDefaults'也會定期自動同步到文件。 – 2010-12-22 08:55:57

3

您需要監聽設置更改。做到這一點最好的辦法就是建立一個監聽器,無論你需要它:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(settingsChanged) name:NSUserDefaultsDidChangeNotification object:nil]; 

你需要確保的唯一的事情是,你不變化在你的聽衆任何設置,或者你無限遞歸沒有多一點邏輯被添加進去。

我會遠離同步,因爲根據我的經驗,我發現我必須運行兩次。但那是偶然的行爲。當新的設置從商店重新讀取時,監聽者會通知您。

+0

使用它的缺點是,當你自己改變關於'NSUserDefaults'的任何東西時它也會被觸發。因此,每次調用'[[NSUserDefaults standardUserDefaults] setObject:someObject forKey:@「someKey」]時,都會廣播該通知,並調用該方法。這不是我(也可能是提問者)想要的。此外,我沒有任何問題與'同步',調用它只有一次工作正常。 – 2010-07-10 16:09:40

+0

這種方式顯然更好。只需更新用戶默認值,並僅在通知觀察者中進行行爲更改。而且,在iOS4多任務應用程序運行期間,您必須實時應用任何用戶deafult更改。 – Eonil 2010-10-08 08:54:30