iOS--序列化数据并保存

开发中经常有这么一个场景: 从服务器读取一组数据,转换成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()
        }
    }

你可能感兴趣的:(iOS--序列化数据并保存)