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