iOS应用程序的plist是否应该进行压缩以进行优化?

时间:2011-04-11 15:48:55

标签: ios serialization

我正在开发的应用程序正在使用大量占用大量空间的plist。我正在考虑压缩plist文件。在运行时,应用程序会将它们解压缩到NSData中,并使用NSPropertyListSerialization将它们反序列化为NSDictionary,以便最终使用。

这种方法有什么风险吗?如果Property List Output Encoding设置为二进制,它是否无用。

2 个答案:

答案 0 :(得分:1)

如果你正在考虑使用资产列表来节省空间,我认为是时候采用不同的格式了。属性列表适用于存储一些默认值或某些设置,但它们不是数据库的替代品。

我的建议是将这些数据移动到核心数据数据库中。如果您尝试将大型数字文件作为元素嵌入属性列表中,请查看将这些文件作为单独的资源存储在应用程序包或应用程序的/ Documents目录中。

核心数据将允许您根据需要延迟加载项目,节省加载时间和内存,其SQLite基础将提供快速读/写时间。

答案 1 :(得分:0)

如果您的项目设置已正确设置(即,您提到的属性列表输出编码在活动目标的设置中设置为二进制),则所有的.plist文件将转换为二进制形式。查看构建产品的包,查看文件的大小。

<强>更新

进一步调查显示,如果您将包含plist文件的目录添加为文件夹参考,Xcode将不会查看其内部,它只会将其内容复制到生成的包中。因此,您应该使用 plutil 自行转换plists。

自动执行任务的一种可能方法是在Xcode中向目标添加构建脚本阶段,并使其以递归方式将所有文件从目录A复制到目录B,转换所有文件以 .plist 结尾。然后将B添加到您的目标作为参考,而不是A,您就可以了。

您也可以简单地为二进制plist创建一个新目录,并将它们添加到目标而不是普通的XML plist。

以下是脚本的外观。假设所有plist都存储在名为dir(或其任何子目录)的目录中,并且它位于路径/path/to/dir。要将它们全部转换为目录/path/to/B,可以编写以下内容:

#!/bin/bash

find "/path/to/dir" -iname '*.plist' | xargs -L 1 -J % cp % "/path/to/B"
find "/path/to/B" -iname '*.plist' | xargs -L 1 plutil -convert binary1