開發(fā)中經(jīng)常有這么一個(gè)場景: 從服務(wù)器讀取一組數(shù)據(jù)你辣,轉(zhuǎn)換成model并存入數(shù)組中旋廷,有時(shí)候這組數(shù)據(jù)并不是需要每次從服務(wù)器讀取急前,這個(gè)時(shí)候函荣,我們可以對(duì)數(shù)據(jù)進(jìn)行緩存操作显押。將這組數(shù)據(jù)存入文件中。
這里有幾種緩存的方式傻挂,比如乘碑,直接將服務(wù)器請(qǐng)求的數(shù)據(jù),一般是一組json字符串寫入文件金拒,也有將json數(shù)據(jù)解析model化并存入數(shù)組或者字典后寫入文件兽肤。這篇文章記錄的是后面一種保存數(shù)據(jù)的方式。這里我們以數(shù)組為例绪抛。
有一個(gè)數(shù)組lists资铡,里面存了數(shù)量若干的checklist,每個(gè)checklistItem是一個(gè)model
model序列化
首先要對(duì)mode進(jìn)行序列化處理幢码,繼承NSObject笤休,并實(shí)現(xiàn)NSCoding協(xié)議,將屬性進(jìn)行encode處理
class Checklist: NSObject, NSCoding{
var text = ""
var checked = false
func toggleChecked(){
checked = !checked
}
func encode(with aCoder: NSCoder) {
aCoder.encode(text, forKey: "Text")
aCoder.encode(checked, forKey: "Checked")
}
required init?(coder aDecoder: NSCoder) {
super.init()
}
override init() {
super.init()
}
}
將數(shù)據(jù)寫入文件
func saveChecklists() {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encode(lists, forKey: "Checklists")
archiver.finishEncoding()
data.write(to: filePath(), atomically: true)
}
首先創(chuàng)建一個(gè)NSKeyedArchiver 對(duì)象症副,然后利用encode方法對(duì)需要進(jìn)行保存的數(shù)組進(jìn)行編碼
店雅,也就是plist化政基。最后將數(shù)據(jù)data寫入到文件中。
進(jìn)行這一步操作后闹啦,就可以在沙盒中找到我們要保存的數(shù)據(jù)沮明,數(shù)據(jù)以plist的方式存儲(chǔ)
從plist中讀取已保存的數(shù)據(jù)
func loadChecklists(){
let path = filePath()
if let data = try? Data(contentsOf: path){
let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
lists = unarchiver.decodeObject(forKey: "Checklists") as! [Checklist]
unarchiver.finishDecoding()
}
}