常見(jiàn)存儲(chǔ)方式
- Plist 格式文件存儲(chǔ)
- NSUserDefaults 沙盒存儲(chǔ)(個(gè)人偏好存儲(chǔ))
- 文件讀寫(xiě)儲(chǔ)存
- 解歸檔存儲(chǔ)
- 數(shù)據(jù)庫(kù)存儲(chǔ)
- Keychain 存儲(chǔ)(可解決設(shè)備唯一標(biāo)識(shí)問(wèn)題)
Demo 示例
- 文件讀寫(xiě)操作画舌、沙盒操作、解歸檔操作渣蜗、依賴 FMDB 的數(shù)據(jù)庫(kù)操作 以及 UIWeb/WKWeb 緩存清理 、NSPredicate 數(shù)據(jù)篩查等操作 DataStore Git地址
- 依賴 MagicalRecord 的數(shù)據(jù)庫(kù)操作 CoreDataPro
- 獲取設(shè)備信息 - keychain 存儲(chǔ) GainRelativeInfo
- Demo 做筆記使用绷旗,持續(xù)更新 委煤。康铭。。
數(shù)據(jù)存儲(chǔ)基礎(chǔ)
作為移動(dòng)端開(kāi)發(fā)工程師披粟,所需要的數(shù)據(jù)幾乎全部都是通過(guò)網(wǎng)絡(luò)獲取彩扔,而且網(wǎng)絡(luò)請(qǐng)求都有時(shí)耗;在網(wǎng)絡(luò)好的情況下這種時(shí)耗雖然不足考慮僻爽,但是一旦網(wǎng)絡(luò)環(huán)境不好虫碉,會(huì)很影響產(chǎn)品體驗(yàn)。網(wǎng)絡(luò)環(huán)境無(wú)法控制胸梆,但是對(duì)于一些數(shù)據(jù)不經(jīng)常變動(dòng)的網(wǎng)絡(luò)請(qǐng)求或沒(méi)必要實(shí)時(shí)更新的數(shù)據(jù)敦捧,我們可以選擇將網(wǎng)絡(luò)數(shù)據(jù)緩存本地,適時(shí)更新碰镜。
在iOS中涉及存儲(chǔ)方式不外乎這幾種兢卵,只是大家各自的分類方式可能有些不同。這里僅是自己的思考與分類绪颖。
了解緩存秽荤,有必要先了解一下沙盒這個(gè)概念。
沙盒其實(shí)質(zhì)就是在iOS系統(tǒng)下,每個(gè)應(yīng)用在內(nèi)存中所對(duì)應(yīng)的儲(chǔ)存空間窃款。
每個(gè)iOS應(yīng)用都有自己的應(yīng)用沙盒(文件系統(tǒng)目錄)课兄,與其他文件系統(tǒng)隔離,各個(gè)沙盒之間相互獨(dú)立晨继,而且不能相互訪問(wèn)(手機(jī)沒(méi)有越獄的情況下)烟阐。
各個(gè)應(yīng)用程序的沙盒是相互獨(dú)立的,在系統(tǒng)內(nèi)存消耗過(guò)高時(shí)紊扬,系統(tǒng)會(huì)收到內(nèi)存警告并自動(dòng)將一些退出軟件蜒茄。這就保證了系統(tǒng)的數(shù)據(jù)的安全性及系統(tǒng)的穩(wěn)定性。一個(gè)應(yīng)用的沙盒目錄如下:
- Documents 應(yīng)用程序在運(yùn)行時(shí)生成的一些需要長(zhǎng)久保存的數(shù)據(jù)餐屎。
- Library/Caches 儲(chǔ)存應(yīng)用程序網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)信息(音視頻與圖片等的緩存)檀葛。此目錄下的數(shù)據(jù)不會(huì)自動(dòng)刪除,需要程序員手動(dòng)清除該目錄下的數(shù)據(jù)腹缩。主要用于保存應(yīng)用在運(yùn)行時(shí)生成的需要長(zhǎng)期使用的數(shù)據(jù).一般用于存儲(chǔ)體積較大數(shù)據(jù)驻谆。
- Library/Preferences 設(shè)置應(yīng)用的一些功能會(huì)在該目錄中查找相應(yīng)設(shè)置的信息,該目錄由系統(tǒng)自動(dòng)管理,通常用來(lái)儲(chǔ)存一些基本的應(yīng)用配置信息,比如賬號(hào)密碼,自動(dòng)登錄等。
- tmp 保存應(yīng)用運(yùn)行時(shí)產(chǎn)生的一些臨時(shí)數(shù)據(jù);應(yīng)用程序退出庆聘、系統(tǒng)空間不夠、手機(jī)重啟等情況下都會(huì)自動(dòng)清除該目錄的數(shù)據(jù)勺卢,iTunes或iCloud也不會(huì)對(duì)其進(jìn)行備份伙判。無(wú)需程序員手動(dòng)清除該目錄中的數(shù)據(jù)。
- SystemData - 近期優(yōu)化項(xiàng)目數(shù)據(jù)存儲(chǔ)黑忱,發(fā)現(xiàn)多了該文件路徑宴抚,暫未做過(guò)多研究。
Plist 格式文件存儲(chǔ)
- plist文件甫煞,即屬性列表文件菇曲。
- 可以存儲(chǔ)的數(shù)據(jù)類型有 Array Dictionary String Boolean Date Data Number。
- 常用于儲(chǔ)存用戶的設(shè)置 或 存儲(chǔ)項(xiàng)目中經(jīng)常用到又不經(jīng)常修改的數(shù)據(jù)抚吠。
- 創(chuàng)建 .plist 文件可以使用可視化工具即Xcode ,也可以使用代碼常潮。
- 不適合存儲(chǔ)大量數(shù)據(jù),而且只能存儲(chǔ)基本數(shù)據(jù)類型楷力。
- 雖然可以實(shí)現(xiàn) :增 刪 改 查 等操作喊式,但由于數(shù)據(jù)的存取必須是一次性全部操作,所以性能方面表現(xiàn)并不好萧朝。
文件創(chuàng)建
字符串寫(xiě)入
數(shù)組寫(xiě)入
字典寫(xiě)入
數(shù)據(jù)讀取
NSUserDefaults 沙盒存儲(chǔ)(個(gè)人偏好存儲(chǔ))
- 補(bǔ)充幾個(gè)方法:
isSubclassOfClass :參數(shù)為類 - 參數(shù)類為其子類或本身 岔留;
isMemberOfClass :參數(shù)為實(shí)例對(duì)象 - 參數(shù)所屬類為其本身 ;
isKindOfClass :參數(shù)為實(shí)例對(duì)象 - 參數(shù)所屬類為其子類或本身 检柬。
- 應(yīng)用程序啟動(dòng)后献联,會(huì)在沙盒路徑Library -> Preferences 下默認(rèn)生成以工程bundle為名字的 .plist 文件 , 該方式存儲(chǔ)的數(shù)據(jù)即存進(jìn)該文件當(dāng)中。
- 常用語(yǔ)存儲(chǔ)用戶的個(gè)人偏好設(shè)置。
- 這種方式本質(zhì)是操作plist文件里逆,所以性能方面的考慮同plist文件數(shù)據(jù)儲(chǔ)存进胯。
文件讀寫(xiě)儲(chǔ)存
- 文件操作可通過(guò)單例 NSFileManager 處理。文件存儲(chǔ)的路徑可以代碼設(shè)置运悲。
- 可以存儲(chǔ)大量數(shù)據(jù)龄减,對(duì)數(shù)據(jù)格式?jīng)]有限制。
- 但由于數(shù)據(jù)的存取必須是一次性全部操作班眯,所以在頻繁操作數(shù)據(jù)方面性能欠缺希停。
解歸檔存儲(chǔ)
- plist 與 NSUserDefaults(個(gè)人偏好設(shè)置)兩種類型的儲(chǔ)存只適用于系統(tǒng)自帶的一些常用類型,而且前者必須拿到文件路徑署隘,后者也只能儲(chǔ)存應(yīng)用的主要信息宠能。
- 對(duì)于開(kāi)發(fā)中自定義的數(shù)據(jù)模型的儲(chǔ)存,我們可以考慮使用歸檔儲(chǔ)存方案磁餐。
- 歸檔保存數(shù)據(jù)违崇,文件格式自己可以任意,沒(méi)有要求 ; 即便設(shè)置為常用的數(shù)據(jù)格式(如:.c .txt .plist 等)要么不能打開(kāi)诊霹,要么打開(kāi)之后亂碼顯示羞延。
- 值得注意的是使用歸檔保存的自定義模型需要實(shí)現(xiàn)NSCoding協(xié)議下的兩個(gè)方法。
- 不適合存儲(chǔ)大量數(shù)據(jù)脾还,可以存儲(chǔ)自定義的數(shù)據(jù)模型伴箩。
- 雖然歸檔可以存儲(chǔ)自定義的數(shù)據(jù)結(jié)構(gòu),但在大批量處理數(shù)據(jù)時(shí)鄙漏,性能上仍有所欠缺嗤谚。
數(shù)據(jù)庫(kù)存儲(chǔ)
SQLite : 它是一款輕型的嵌入式數(shù)據(jù)庫(kù),安卓和ios開(kāi)發(fā)使用的都是SQLite數(shù)據(jù)庫(kù)怔蚌;占用資源非常的低巩步,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了桦踊;而且它的處理速度比Mysql椅野、PostgreSQL這兩款著名的數(shù)據(jù)庫(kù)都還快。
FMDB 正式基于 SQLite 開(kāi)發(fā)的一套開(kāi)源庫(kù)籍胯。使用時(shí)鳄橘,需要自己寫(xiě)一些簡(jiǎn)單的SQLite語(yǔ)句。
CoreData 是蘋(píng)果給出的一套基于 SQLite 的數(shù)據(jù)存儲(chǔ)方案芒炼;而且不需要自己寫(xiě)任何SQLite語(yǔ)句瘫怜。該功能依賴于 CoreData.framework 框架,該框架已經(jīng)很好地將數(shù)據(jù)庫(kù)表和字段封裝成了對(duì)象和屬性本刽,表之間的一對(duì)多鲸湃、多對(duì)多關(guān)系則封裝成了對(duì)象之間的包含關(guān)系赠涮。
Core Data的強(qiáng)大之處就在于這種關(guān)系可以在一個(gè)對(duì)象更新時(shí),其關(guān)聯(lián)的對(duì)象也會(huì)隨著更新暗挑,相當(dāng)于你更新一張表的時(shí)候笋除,其關(guān)聯(lián)的其他表也會(huì)隨著更新。Core Data的另外一個(gè)特點(diǎn)就是提供了更簡(jiǎn)單的性能管理機(jī)制炸裆,僅提供幾個(gè)類就可以管理整個(gè)數(shù)據(jù)庫(kù)垃它。由于直接使用蘋(píng)果提供的CoreData容易出錯(cuò),這里提供一個(gè)很好的三方庫(kù) MagicalRecord 烹看。
關(guān)于 Core Data 想吐槽的是国拇,數(shù)據(jù)存儲(chǔ)功能雖然封裝的很好、功能很強(qiáng)大惯殊,但是版本迭代中反復(fù)修改數(shù)據(jù)模型酱吝、新增數(shù)據(jù)模型等問(wèn)題引起的數(shù)據(jù)庫(kù)遷移問(wèn)題給開(kāi)發(fā)工作帶來(lái)很多不必要的工作;尤其有未解除過(guò)該技術(shù)的新人加入土思。
Pod 添加 MagicalRecord 依賴庫(kù)之后务热,文件創(chuàng)建 - 數(shù)據(jù)實(shí)體創(chuàng)建 - 數(shù)據(jù)遷移 :
新建工程 ,Use Core Data 可選可不選己儒,這就給未勾選該項(xiàng)的舊工程使用 Core Data 技術(shù)提供可能
cd0.png
創(chuàng)建 .xcdatamodeld 文件
cd1.png
創(chuàng)建實(shí)體崎岂、新增屬性
cd2.png
創(chuàng)建實(shí)體相應(yīng)的關(guān)聯(lián)文件
cd3.png
數(shù)據(jù)庫(kù)遷移步驟 1
cd4.png
數(shù)據(jù)庫(kù)遷移步驟 2
cd5.png
緩存系統(tǒng)
APP緩存系統(tǒng)設(shè)計(jì)簡(jiǎn)要記錄(整理中)
HybridAPP(整理優(yōu)化中)
對(duì)大多數(shù) APP 而言,都是 Hybrid 開(kāi)發(fā)闪湾,Web 頁(yè)與原生同時(shí)存在冲甘,其中 Web 頁(yè)可能是 UIWeb 也可能是 WKWeb 。所以與之相應(yīng)的緩存系統(tǒng)响谓,應(yīng)該包括 Web 緩存與 原生接口數(shù)據(jù)緩存兩部分。
Web 緩存有網(wǎng)絡(luò)緩存及 Webkit 框架機(jī)制內(nèi)的緩存省艳。這里也可以依據(jù) URL + 時(shí)間戳 自行設(shè)計(jì)一套緩存娘纷。
-
原生接口部分的數(shù)據(jù)緩存
- 與用戶相關(guān)的信息、單個(gè)標(biāo)記符標(biāo)識(shí)等常采用沙盒存儲(chǔ)跋炕。
- 全局使用到的數(shù)據(jù)模型赖晶,需要永久存儲(chǔ)的話可以考慮歸檔;例如用戶登陸后的個(gè)人信息數(shù)據(jù)模型辐烂。
- 倘若不涉及大規(guī)模數(shù)據(jù)的增刪改查等操作遏插,可以考慮文件讀寫(xiě)的方式直接存儲(chǔ)網(wǎng)絡(luò)返回的 JSON 對(duì)象,借助 YYCache 亦可實(shí)現(xiàn)高性能存儲(chǔ)纠修。
- 大規(guī)模數(shù)據(jù)的存儲(chǔ)例如帖子胳嘲、評(píng)論、新聞扣草、外賣(mài)了牛、商品等可以考慮使用數(shù)據(jù)庫(kù):FMDB (DataStoreDemo - JXFMDBMOperator)或 Core Data (推薦使用 CoreData 的封裝庫(kù) MagicalRecord)颜屠;也可以簡(jiǎn)單點(diǎn)直接使用 NSPredicate 對(duì)數(shù)據(jù)的篩查操作,簡(jiǎn)單直接鹰祸。