我使用NSKeyedArchiver()
在Swift中保存和加载对象。
问题是当对象变量发生变化时,比如将新变量添加到对象中,NSKeyedArchiver()无法解码最后保存的对象。
func tripsDataFilePath() -> URL {
return getDocumentsDirectory().appendingPathComponent("Data.plist")
}
我用来保存的代码:
func saveData() {
NSKeyedArchiver.archiveRootObject(data, toFile: dataFilePath().path)
}
和加载代码:
func loadData() {
if let data = NSKeyedUnarchiver.unarchiveObject(withFile: dataFilePath().path) {
project = data as! [Project]
}
}
在更改对象结构时,有没有办法防止数据丢失(无法加载最后的对象)?
开发第一版iOS应用时并不重要。但想象一下,用户下载了应用程序,在新版本中,我想添加需要更改当前数据对象的新功能!然后用户将丢失所有数据。
答案 0 :(得分:0)
我发现问题出在文件格式上。
我使用此名称保存NSKeyedArchiver对象:“Data.plist”
当我删除“.plist”格式时,问题已经解决。
答案 1 :(得分:0)
尝试检查解码数据的方式。我用decodeObject解码所有数据。但是,从swift 3.0开始,您需要具体说明如何解码数据。例如,如果您的数据是整数,而不是使用
让number = aDecoder.decodeObject(forKey:CodingKeys.number)为? INT
你需要使用
let number = aDecoder.decodeInteger(forKey:CodingKeys.number)