objective-c - 将 plist 转换为二进制 plist

标签 objective-c iphone cocoa-touch plist core-foundation

Apple 强烈建议在将基于 XML 的大型数据集读入 iPhone 应用程序时使用二进制 plist 格式。他们的理由之一是 XML 解析在 iPhone 上非常费力。但是,这需要首先转换驻留在远程 Web 服务器上的文件。

对于频繁更改的内容,手动执行此操作是 Not Acceptable 。如果可能的话,我想避免让基于 Web 的应用程序调用命令行来执行转换(即 plutil)。

是否有公开可用的算法来执行此转换?

最佳答案

是的。所有 plist 代码都是 CoreFoundation 的一部分,它是开源的。 CoreFoundation 可以直接在 Linux 和 Windows 上构建和运行,因此您可以使用在 Mac OS X 上使用的普通 API 编写 CF 工具,但在其他平台上构建和运行它。

您要查看的特定 API 是 CFPropertyListWriteToStream() . CoreFoundation 的代码可从 Apple 获得。 ( tarball ),以及其他地方。

最后,根据您更新文件的频率、您在服务器上需要备用多少处理器以及您的数据有多少重复,您可能还可以做一项重要的改进。默认情况下,二进制 plist 中的某些元素是唯一的(例如字符串)。其他元素不是(例如数组和 dictionarts)。二进制 plist 格式允许它们是唯一的,问题是实际遍历和唯一的数组和字典是昂贵的。如果您的内容中有很多相同的数组或字典,您可能会通过对它们进行唯一化来显着减少大小。您可以通过在 CFBinaryPlist.c 中破解 _flattenPlist() 来启用它.

如果您这样做,请确保对其进行非常彻底的测试,并且不要对您无法通过网络更新的任何文件进行测试,以防万一将来的版本进行任何优化会破坏它。此外,请确保您已准备好在接到通知后立即将其关闭。

关于objective-c - 将 plist 转换为二进制 plist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/264440/

相关文章:

ios - 为什么我的自定义 View 不可见?

ios - 根据架构在 Objective-C 中进行条件导入

objective-c - 如何从 C 方法调用 Objective-C 方法?

iphone - 如何使用使用 Interface Builder 创建的 nib 文件加载 UIView

ios - 如何设置 UINavigationBar 的标题?

objective-c - 将 Swift 3 升级到 4, objective-c 中不再有 swift 扩展

ios - 使用相机时从不调用 Affdex AFDXDetector 委托(delegate)函数?

iphone - 链接器命令失败,架构 i386 的符号未定义

iphone - 动画DidStop的CABasicAnimation委托(delegate)?

ios - NSDateFormatter 不识别时区