iOS - NSCoding - 将数据存储在PList vs Documents目录中

问题描述:

为什么我会将编码数据存储在plist中,只需将其存储在结构化字典中?iOS - NSCoding - 将数据存储在PList vs Documents目录中

例如,在苹果公司的学习材料,他们做到这一点:

“let notes = [note1, note2, note3] 
  
let archivedNotes = NSKeyedArchiver.archiveRootObject(notes, 
toFile: archiveURL.path)” 

本质上只是折腾一些路径的数据块。

但我见过有人用Plist文件存储NSCoded数据like this。一种策略比另一种策略有什么优势?处理存储的数据是否有最佳做法,任何人都可以指引我?

纵情看起来给你一些有价值的数据有键(不打算),但你不能只是用你的各种数据的关键字的字典?

对于为什么,当你捕捉一个分层的对象图,为什么讨论,请参阅Archives and Serializations Programming Guide: Serializing Property Lists“编码(如NSCoder及其子类实现)是使对象的首选方法图表老大难”:

序列化将Objective-C类型转换为独立于体系结构的字节流,并将其转换为独立于体系结构的字节流。与归档相比,基本的序列化不会记录数据的数据类型,也不记录它们之间的关系;只有值本身被记录下来。您有责任以正确的顺序反序列化数据。

属性列表序列化不保留对象的完整类标识,只保留其一般类型 - 字典,数组等。因此,如果属性列表被序列化然后反序列化,则结果属性列表中的对象可能与原始属性列表中的对象不是同一类。特别是,当序列化属性列表时,容器对象(NSDictionaryNSArray对象)的可变性不会保留。但是,反序列化时,您可以选择让所有容器对象创建为可变或不可变。

序列化也不跟踪多次引用对象的存在。对属性列表中的对象的每个引用都单独序列化,导致反序列化时出现多个实例。由于序列化不保留类信息或可变性,也不处理多个引用,因此编码(由NSCoder及其子类实现)是使对象图持久化的首选方法。

底线,你通常喜欢使用NSKeyedArchiver(或雨燕4,PropertyListEncoder),因为它捕捉有关编码并可以捕捉更丰富的类型类的信息。

尽管如此,plists非常简单,并且通常以文本格式呈现,可以很容易地对结果数据进行可视化检查,并且您可以查看捕获的内容。通常,如果你正在处理一个简单的列表,plists是一个不错的,稍微简化的解决方案。