2016-11-25 41 views
5

所以我看了一下NSUserDefaults的synchronize()方法的蘋果文檔。見下面以供參考:何時以及爲什麼要使用NSUserDefaults的synchronize()方法?

https://developer.apple.com/reference/foundation/userdefaults/1414005-synchronize

頁當前讀取:

因爲這個方法是每隔一段時間自動調用,使用此方法僅如果你不能等待自動同步(例如,如果您的應用程序即將退出),或者即使您未做任何更改,也希望將用戶的默認值更新爲磁盤上的內容。

但是,我仍然不明白的是什麼時候應該調用這個方法?例如,每當用戶更改應用程序的設置時,它是否應該被調用?或者我應該相信背景API將會處理這個問題?在內存更改設置後立即離開視圖會導致該更改丟失?

另外,什麼時候調用synchronize()失敗會導致用戶設置沒有正確更改?

此外,調用此方法的成本(性能,內存或其他)是多少?我知道它涉及從磁盤讀寫數據,但是這真的會在手機上花費很多精力嗎?

回答

18

似乎對用戶的默認有太多的困惑。這樣想想吧。這與您在整個應用程序中使用全局字典基本相同。如果您添加/編輯/刪除全局字典中的鍵/值,則此更改會立即顯示在代碼中的任何位置。由於這本字典在內存中,所以當你的應用程序終止時,如果它沒有保存到文件中,所有內容都會丟失。 NSUserDefaults每隔一段時間自動將字典保存到文件中。

synchronize方法的唯一原因是您的應用程序可以告訴NSUserDefaults將字典「now」保留,而不是等待最終會發生的自動保存。

而你需要這麼做的唯一原因是因爲你的應用可能在下一次自動保存之前被終止(或崩潰)。

在我自己的應用程序中,我唯一呼叫synchronize的地方在applicationDidEnterBackground委託方法中。這是爲了確保最新未保存的更改在應用程序在後臺終止的情況下保留下來。

我覺得很多困惑來自在開發過程中調試應用程序。在開發過程中,您通過調試器中的「停止」按鈕關閉應用程序並不罕見。很多次這種情況發生在最近的NSUserDefaults更改仍然存在之前。所以我開發了一個習慣,在每次我想確保最新的更新被保留時,在調試器中殺死應用程序之前按主頁按鈕將我的應用程序置於後臺。

鑑於上述總結,讓我們回顧一下你的問題:

應該是每一個用戶更改應用程序的設置時間來叫什麼名字?

不可以。如上所述,任何更改都會立即自動提供。

或者我應該相信後臺api會處理這個問題嗎?

是的,請相信自動持續性,除非您的應用程序進入後臺時調用synchronize

並且在內存中的設置更改導致該更改丟失後立即離開視圖?

這沒有效果。一旦您添加/編輯/刪除NSUserDefaults中的某個鍵/值,就會進行更改。

另外,什麼時候調用synchronize()失敗會導致用戶設置沒有正確更改?

更改可能會丟失的唯一時間是您的應用程序在最新更改持續之前終止。當您的應用進入後臺時調用synchronize可解決大部分這些問題。剩下的唯一可能的問題是如果你的應用程序崩潰。尚未保存的未保存的更改將會丟失。修復您的應用程序,使其不會崩潰。

此外,調用此方法的成本(性能,內存或其他)是多少?我知道它涉及從磁盤讀寫數據,但是這真的會在手機上花費很多精力嗎?

自動持久性在後臺完成,它只是將一個字典寫入plist文件。這是非常快,除非你沒有遵循建議。如果您錯誤地使用NSUserDefaults來存儲大量數據,速度會變慢。

+0

偉大的答案!謝謝,這爲我清除了很多東西,並根據我已閱讀的內容制定了很多意義。 –

0

據我所知,同步用於立即同步數據,但iOS可以以智能方式處理數據。所以你不需要每次都調用它。如果你每次都調用它,那麼它會轉向性能問題。

檢查蘋果文檔: Official Link

相關問題