前言
在實際的iOS開發中,有些時候涉及到將程式的狀態儲存下來,以便下一次恢複,或者是記錄使用者的一些喜好和使用者的登入資訊等等。 這就需要涉及到資料的持久化了,所謂資料持久化就是資料的本地儲存,將資料從記憶體中遷入到儲存空間上。網上有很多種資料持久化的方法,如實現自己實現I/O、資料庫、雲或則走第三方介面等等。但是有時候可能只是進行一些簡單的資料存放區,如使用者的喜好設定、使用者的sessionID等等,這時候使用上述方法便顯得有點興師動眾了,現在需要一種更加輕量化的操作方式。
一、認識 NSUserDefaults
為了尋求上述問題的解決方案,查閱apple官方文檔發現,有一個類NSUserDefaults是蘋果設計專門用來解決這個問題的:
NSUserDefaults is a hierarchical persistent interprocess (optionally distributed) key-value store, optimized for storing user settings.
翻譯大致如下:
NSUserDefaults 是一種進程間(任意分布)的分層級持久化鍵-值儲存,為儲存使用者佈建而最佳化。
詳細說明可以查閱官方文檔,這裡只介紹其使用。
現在,我們已經找到了一種輕量級的資料持久化解決方案了,為什麼說它輕量級呢。因為apple官方設計它的目的就是為瞭解決使用者佈建的儲存問題,下面就來介紹它的使用。
二、使用 NSUserDefaults
由於NSUserDefaults是一種進程間的解決方案,所以我們可以在任意一個進程中調用它來訪問和儲存使用者的資訊。
舉個例子:我們要對使用者的使用者名稱進行資料的持久化操作
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];[userDefaults setObject:@"whf" forKey:@"name"];
通過上面這兩行代碼,我們就已經將使用者的姓名通過索引值對的方式儲存到本地了。不需要指定資料的儲存位置,一切由系統搞定,我們只需要告訴系統我們要存什麼。如果多次儲存的是同一個鍵的值,那麼這個鍵的值是根據最後一次的值定的,也就是說系統是覆蓋寫,而不是追加寫最後返回的是數組。
接下來示範取資料的過程:在任意線程中,我們調用
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];NSString *userName = [userDefaults objectForKey:@"name"];
這兩句就可以從儲存空間上獲得我們要的資料了,如果資料不存在,那麼返回的對象就是nil。
三、底層實現機制
通過NSUserDefaults的使用,發現程式重新運行資料依舊存在,那麼這個資料肯定是被儲存在了手機的儲存空間上。現在來探尋它的實現機制:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"123" forKey:@"name"]; NSString *userName = [userDefaults objectForKey:@"name"]; NSLog(@"%@",userName); NSString *homeDirectory = NSHomeDirectory(); NSLog(@"homeDire --------%@",homeDirectory);
運行結果:
根據路徑進入沙箱發現,在沙箱的Library/Preferences/目錄下發現多出了一個com.itripbuyer.Date-Persistence.plist
的plist檔案。
開啟後發現裡面有一個索引值對,並且就是我們剛剛操作的資料。於是我猜測,通過我們剛才的兩行代碼,系統將我們的資料轉換成了一個plist檔案,這個檔案中裝載的是一些索引值對。
四、靈活巧用
NSUserDefaults 官方給出的用途是儲存使用者的Setting,但是通過上述操作發現,程式中凡是涉及到索引值對的儲存,都可以使用NSUserDefaults來實現,即使不是索引值對的形式,轉換成索引值對也要用NSUserDefaults來實現,這樣既省時又省力,還能用最簡潔的代碼換來最穩定的資料持久化操作。
以上就是iOS用兩行代碼完美解決資料持久化的全部內容,希望本文對大家開發IOS的時候有所協助。