前言
在實際的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的時候有所幫助。