iOS用兩行代碼完美解決數(shù)據(jù)持久化
前言
在實際的iOS開發(fā)中,有些時候涉及到將程序的狀態(tài)保存下來,以便下一次恢復(fù),或者是記錄用戶的一些喜好和用戶的登錄信息等等。 這就需要涉及到數(shù)據(jù)的持久化了,所謂數(shù)據(jù)持久化就是數(shù)據(jù)的本地保存,將數(shù)據(jù)從內(nèi)存中遷入到存儲器上。網(wǎng)上有很多種數(shù)據(jù)持久化的方法,如實現(xiàn)自己實現(xiàn)I/O、數(shù)據(jù)庫、云或則走第三方接口等等。但是有時候可能只是進(jìn)行一些簡單的數(shù)據(jù)存儲,如用戶的偏好設(shè)置、用戶的sessionID等等,這時候使用上述方法便顯得有點興師動眾了,現(xiàn)在需要一種更加輕量化的操作方式。
一、認(rèn)識 NSUserDefaults
為了尋求上述問題的解決方案,查閱apple官方文檔發(fā)現(xiàn),有一個類NSUserDefaults是蘋果設(shè)計專門用來解決這個問題的:
NSUserDefaults is a hierarchical persistent interprocess (optionally distributed) key-value store, optimized for storing user settings.
翻譯大致如下:
NSUserDefaults 是一種進(jìn)程間(任意分布)的分層級持久化鍵-值存儲,為存儲用戶設(shè)置而優(yōu)化。
詳細(xì)說明可以查閱官方文檔,這里只介紹其使用。
現(xiàn)在,我們已經(jīng)找到了一種輕量級的數(shù)據(jù)持久化解決方案了,為什么說它輕量級呢。因為apple官方設(shè)計它的目的就是為了解決用戶設(shè)置的存儲問題,下面就來介紹它的使用。
二、使用 NSUserDefaults
由于NSUserDefaults是一種進(jìn)程間的解決方案,所以我們可以在任意一個進(jìn)程中調(diào)用它來訪問和存儲用戶的信息。
舉個例子:我們要對用戶的用戶名進(jìn)行數(shù)據(jù)的持久化操作
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"whf" forKey:@"name"];
通過上面這兩行代碼,我們就已經(jīng)將用戶的姓名通過鍵值對的方式存儲到本地了。不需要指定數(shù)據(jù)的存儲位置,一切由系統(tǒng)搞定,我們只需要告訴系統(tǒng)我們要存什么。如果多次存儲的是同一個鍵的值,那么這個鍵的值是根據(jù)最后一次的值定的,也就是說系統(tǒng)是覆蓋寫,而不是追加寫最后返回的是數(shù)組。
接下來演示取數(shù)據(jù)的過程:在任意線程中,我們調(diào)用
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSString *userName = [userDefaults objectForKey:@"name"];
這兩句就可以從存儲器上獲得我們要的數(shù)據(jù)了,如果數(shù)據(jù)不存在,那么返回的對象就是nil。
三、底層實現(xiàn)機(jī)制
通過NSUserDefaults的使用,發(fā)現(xiàn)程序重新運(yùn)行數(shù)據(jù)依舊存在,那么這個數(shù)據(jù)肯定是被存儲在了手機(jī)的存儲器上?,F(xiàn)在來探尋它的實現(xiàn)機(jī)制:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"123" forKey:@"name"]; NSString *userName = [userDefaults objectForKey:@"name"]; NSLog(@"%@",userName); NSString *homeDirectory = NSHomeDirectory(); NSLog(@"homeDire --------%@",homeDirectory);
運(yùn)行結(jié)果:
根據(jù)路徑進(jìn)入沙盒發(fā)現(xiàn),在沙盒的Library/Preferences/目錄下發(fā)現(xiàn)多出了一個com.itripbuyer.Date-Persistence.plist
的plist文件。
打開后發(fā)現(xiàn)里面有一個鍵值對,并且就是我們剛剛操作的數(shù)據(jù)。于是我猜測,通過我們剛才的兩行代碼,系統(tǒng)將我們的數(shù)據(jù)轉(zhuǎn)換成了一個plist文件,這個文件中裝載的是一些鍵值對。
四、靈活巧用
NSUserDefaults 官方給出的用途是存儲用戶的Setting,但是通過上述操作發(fā)現(xiàn),程序中凡是涉及到鍵值對的存儲,都可以使用NSUserDefaults來實現(xiàn),即使不是鍵值對的形式,轉(zhuǎn)換成鍵值對也要用NSUserDefaults來實現(xiàn),這樣既省時又省力,還能用最簡潔的代碼換來最穩(wěn)定的數(shù)據(jù)持久化操作。
以上就是iOS用兩行代碼完美解決數(shù)據(jù)持久化的全部內(nèi)容,希望本文對大家開發(fā)IOS的時候有所幫助。
相關(guān)文章
淺談iOS 數(shù)據(jù)結(jié)構(gòu)之鏈表
這篇文章主要介紹了淺談iOS 數(shù)據(jù)結(jié)構(gòu)之鏈表,本文詳細(xì)的介紹了單鏈表和雙鏈表,具有一定的參考價值,有興趣的可以了解一下2017-09-09iOS實現(xiàn)相冊和網(wǎng)絡(luò)圖片的存取
本篇文章主要介紹了iOS實現(xiàn)相冊和網(wǎng)絡(luò)圖片的存取,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04iOS中的導(dǎo)航欄UINavigationBar與工具欄UIToolBar要點解析
UINavigation可以附著于導(dǎo)航控制器之中使用,也可以在controller中單獨(dú)使用,這里我們將來看iOS中的導(dǎo)航欄UINavigationBar與工具欄UIToolBar要點解析.2016-06-06iOS開發(fā)中使用UIWebView 屏蔽 alert警告框
這篇文章主要介紹了iOS開發(fā)中使用UIWebView 屏蔽 alert警告框的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11