我正在使用一个 plist 文件,其中包含我的所有应用程序数据。该文件非常大,目前我在第一次启动时将所有内容加载到数组和字典中并将它们保存到 UserDefaults 中,这样我就不必再次触摸 plist。由于这大约需要 10 秒(iP4),我想知道是否有更快(更好)的方法来处理 plist。我用 Instruments 检查了整个启动过程,并且通过数百个条目实际上是最快的部分。将这些处理过的东西保存到 NSUserDefaults 中需要很长时间。
问问题
505 次
2 回答
0
几点。
- NSUserDefaults 可能只是一个很大的 plist,那么为什么要使用它呢?将您的条目粘贴到包含内存结构的单例中。
- 如果您因为希望它是可变的而在第一次加载时执行此操作,请将默认值放入您的资源文件夹中。当您要加载它时,请检查文档文件夹中是否有它,如果没有(首先加载),请将其从资源包复制到文档中。
- 如果您使用 NSUserDefaults 进行持久化,只需将您的数据写入 applicationShouldResignActive 中的 plist,以及在您进行重要更改的任何其他时间。
- 将它写在后台线程中,但您可能需要在此处进行一些锁定。
- 加载和保存时间变长时的最佳实践可能是转移到核心数据,但在你需要这样做之前,1-4 应该会给你更多的里程。
于 2013-05-02T20:21:42.880 回答
0
您可能会受益于将 plist 保存到您自己的文件中。这样你就可以控制读/写,没有任何与 NSUserDefaults 相关的开销,最重要的是,可以确保格式。也就是说,如果读/写导致速度变慢,那么您必须最小化 plist 文件的大小。可能使用 plist 格式NSPropertyListBinaryFormat_v1_0
会做到这一点:
看:
+ (NSInteger) writePropertyList: (id) plist
toStream: (NSOutputStream *) stream
format: (NSPropertyListFormat)format
options: (NSPropertyListWriteOptions) opt
error: (NSError **) error
来自 Apple 的 Property List Programming Guide:
第一种方法[使用 NSDictionary 或 NSArray writeToFile] 更简单——它只需要一个方法调用而不是两个——但第二种方法[如上所述] 有其优势。它允许您将运行时属性列表转换为二进制格式以及 XML 属性列表。当您将属性列表的静态表示转换回对象图时,它还允许您更灵活地指定这些对象是可变的还是不可变的。
于 2013-05-02T20:06:33.577 回答