NSKeyedArchiver 只编码数组的一部分

Posted

技术标签:

【中文标题】NSKeyedArchiver 只编码数组的一部分【英文标题】:NSKeyedArchiver encode only part of an array 【发布时间】:2011-05-27 20:23:45 【问题描述】:

我有一个有时会更改的对象列表,并且我想在应用程序关闭或移至后台时在设备上保留一个持久缓存。 列表中的大多数对象都不会改变,所以我想知道保存列表的最佳方法是什么。我有两个主要的选择:

    使用 NSKeyedArchiver / unArchiver - 这是最方便的方法,因为我正在序列化的对象包含其他自定义对象,因此我可以为每个对象编写自定义编码方法。主要问题是我在谷歌上没有找到如何只序列化更改的对象,每次序列化整个列表似乎非常浪费。

    使用 SQLite - 这是我目前正在使用的,这里最糟糕的问题是添加 \ 更改对象的属性非常复杂,而且不太优雅。

有什么方法可以让我享受 NSKeyedArchiver 的便利,但只序列化改变的对象?

【问题讨论】:

您考虑过使用核心数据吗? NSKeyedArchiver 只能一次读取所有内容。 是的,但是实现核心数据对我的应用来说是一个重大变化,而且是一个巨大的矫枉过正。 您对使用 NSKeyedArchiver 的列表大小有什么建议吗?我的列表将包含大约 1000-2000 个项目,每个项目最多 500 个字节。 【参考方案1】:

像 Adam Ko 一样,我建议使用 Core Data: 毕竟这种问题才是它真正擅长的!

如果您的缓存项彼此独立,这可以通过简单地包装您的缓存项由NSManagedObject 的薄层来实现(即您可以从 Core Data 中受益,只需少量更改您的应用)。

此包装实体可以将缓存项的存档版本存储在 NSBinaryDataAttributeType 类型的属性中,并通过瞬态属性提供对未存档对象的访问。 示例见Non-Standard Persistent Attributes。

【讨论】:

以上是关于NSKeyedArchiver 只编码数组的一部分的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSKeyedArchiver 解码然后编码未知类?

如何使用 NSKeyedArchiver 对自定义类进行编码和解码

如何在 iOS 12 中替换 NSKeyedArchiver 的初始化程序 init(forWritingWith:) 来编码 CKRecord 的元数据

iOS7 NSKeyedArchiver 警告:替换键“UITintColor”的现有值;类层次结构中的编码键可能重复

NSKeyedArchiver archivedDataWithRootObject:

NSArchiver 与 NSKeyedArchiver 性能对比