所以我正在阅读本教程,最后我想出了如何使用NSCoding归档对象,以及使用可用的初始化器再次从文件系统初始化它.
// To encode the object in the first place
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "name")
}
// To 're-initialize' the object
required init?(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObject(forKey: "name") as! String
super.init()
}
Run Code Online (Sandbox Code Playgroud)
但是,我仍然有点不确定整个过程如何在高水平上运作.请告诉我我的想法不正确.
1)如果你的对象采用NSCoding协议,你可以使用encode(with :)函数让NSCoder对象通过函数传递并执行'encode'方法,传递你的对象的实例属性(它本身就是一个对象) )作为第一个参数,以及表示键作为第二个值的字符串.
2)这是一个递归过程,基本上,你传递对象的实例属性(即名称)的原因是为了使THAT属性(它是一个对象)可以发送编码消息,依此类推,依此类推直到它不再到达NSCoding采用者.
3)aDecoder对象也可以对事物进行解码,因此在初始化自定义对象时,您将需要使用可用的初始化程序来解码为您使用的模糊字符串键设置的任何对象.
这是我真的不明白的......
aDecoder对象如何知道哪个单独的对象用于该组键?例如,假设我有10个狗对象实例.当系统通过一个解码器,并在其上使用decodeObject方法,并且它通过键将self.name设置为该解码对象的值时,aDecoder如何知道该狗的名称被保存为"杰克",而不是偶然抓住其中一个狗实例的名字,比如"Jodi"?
换句话说,一旦你对对象的属性进行编码,文件系统如何知道将对象实例A的属性与对象实例B的属性分开,这样,当应用程序被引导备份并且对象A被初始化时,它只是抓住对象A的属性?
谢谢
我认为您缺少的部分(如果我错了请纠正我)是 NSCoding 不是数据库。它是一个协议,定义了一种序列化对象的方法。
用于解码的 NSCoder 知道哪个对象,因为这是被编码到其中的对象。例如,如果您使用 NSKeyedArchiver(NSCoder 子类,也是使用 NSCoding 的常见方法)将 Dog 保存到磁盘上名为“/tmp/jack.dog”的文件,那么您稍后可以使用 NSKeyedUnarchiver 加载“ /tmp/jack.dog”,并将其反序列化回 Dog 实例。它“知道哪个对象”,因为这是(唯一)保存到该文件的对象。
它不一定是一个文件。数据可以保存在任何地方。
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |