当我将编码数据存储在结构化字典中时,为什么要将编码数据存储在plist中?
例如,在Apple的学习资料中,他们这样做:
“let notes = [note1, note2, note3]
let archivedNotes = NSKeyedArchiver.archiveRootObject(notes,
toFile: archiveURL.path)”
基本上只是在一些路径中抛出一段数据。
但我看到有人使用Plist文件来存储NSCoded数据like this。一种策略优于另一种策略有什么优势?是否存在使用存储数据的最佳实践,任何人都可以指导我?
Plists似乎给你一些带有键的数据的值(punn not intention),但是你不能只用各种数据的键来创建一个字典吗?
答案 0 :(得分:1)
请参阅Archives and Serializations Programming Guide: Serializing Property Lists,了解为什么在您捕获分层对象图时,为什么"编码(由NSCoder
及其子类实现)是首选方式使对象图持久化":
序列化将Objective-C类型转换为与架构无关的字节流。与归档相比,基本序列化不记录值的数据类型,也不记录它们之间的关系;只记录值本身。您有责任按正确的顺序反序列化数据。
属性列表序列化不保留对象的完整类标识,只保留其一般类型 - 字典,数组等。因此,如果属性列表被序列化然后反序列化,则结果属性列表中的对象可能与原始属性列表中的对象不同。特别是,当序列化属性列表时,不会保留容器对象(
NSDictionary
和NSArray
对象)的可变性。但是,在反序列化时,您可以选择将所有容器对象创建为可变或不可变。序列化也不会跟踪多次引用的对象的存在。对属性列表中对象的每个引用都是单独序列化的,在反序列化时会产生多个实例。
因为序列化不保留类信息或可变性,也不处理多个引用,所以编码(由
NSCoder
及其子类实现)是使对象图持久化的首选方法。
最重要的是,您通常更喜欢使用NSKeyedArchiver
(或在Swift 4中,PropertyListEncoder
),因为它会捕获有关已编码的类的信息,并且可以捕获更丰富的类型。
话虽如此,plist非常简单,并且通常以文本格式呈现,以便于直观地检查结果数据,您可以看到捕获的内容。通常情况下,如果你正在处理一个很好的简单列表,plists是一个很好的,稍微简化的解决方案。