开发中经常有这么一个场景: 从服务器读取一组数据,转换成model并存入数组中,有时候这组数据并不是需要每次从服务器读取,这个时候,我们可以对数据进行缓存操作。将这组数据存入文件中。
这里有几种缓存的方式,比如,直接将服务器请求的数据,一般是一组json字符串写入文件,也有将json数据解析model化并存入数组或者字典后写入文件。这篇文章记录的是后面一种保存数据的方式。这里我们以数组为例。
有一个数组lists,里面存了数量若干的checklist,每个checklistItem是一个model
model序列化
首先要对mode进行序列化处理,继承NSObject,并实现NSCoding协议,将属性进行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()
}
}
将数据写入文件
func saveChecklists() {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encode(lists, forKey: "Checklists")
archiver.finishEncoding()
data.write(to: filePath(), atomically: true)
}
首先创建一个NSKeyedArchiver 对象,然后利用encode方法对需要进行保存的数组进行编码
,也就是plist化。最后将数据data写入到文件中。
进行这一步操作后,就可以在沙盒中找到我们要保存的数据,数据以plist的方式存储
从plist中读取已保存的数据
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()
}
}
网友评论