2013-05-02 69 views
1

我正在使用包含所有应用程序数据的plist文件。该文件相当大,目前我在第一次启动时将所有内容加载到数组和字典中,并将它们保存到UserDefaults中,以便我不必再次触摸plist。由于这需要大约10秒(iP4),我不知道是否有更快(更好)的方式来处理plist。我用仪器检查了整个启动过程,并通过数百个条目实际上是最快的部分。将这些处理过的东西保存到NSUserDefaults中需要很长时间。最好的做法来处理大plists?

+0

你知道你几乎没有任何优势重新生成plists? 'NSUserDefaults'也将信息存储在plists中。 – 2013-05-02 19:37:30

+0

您可以在GCD队列中完成所有工作。从一开始就创建一个普通的背景队列,给它一个让你的plist工作的块。像@ H2CO3建议的那样,把所有东西都放在NSUserDefault中,并根据需要创建方法来获取数据。不需要把它放在两个地方。 – John 2013-05-02 19:52:01

+0

这是因为你有很多很多的小数据,或者你有一些巨大的NSData对象?你不应该把它们放在plist中(或者NSUserDefaults,它本身就是plist)。 – matt 2013-05-02 20:00:43

回答

0

将plist保存到自己的文件中可能会有所帮助。这样你可以控制读/写,没有任何与NSUserDefaults相关的开销,最重要的是,可以确保格式。也就是说,如果读/写产生减速,那么你必须最小化plist文件的大小。有可能使用的NSPropertyListBinaryFormat_v1_0一个的plist格式,能做到这一点:

参见:

+ (NSInteger) writePropertyList: (id) plist 
         toStream: (NSOutputStream *) stream 
         format: (NSPropertyListFormat)format 
         options: (NSPropertyListWriteOptions) opt 
          error: (NSError **) error 

从苹果公司的财产清单编程指南:

第一种方法[使用的NSDictionary或NSArray的将writeToFile]是 简单 - 只需要一次方法调用而不是两次 - 但第二种方法[如上]有其优点。它允许您将 运行属性列表转换为二进制格式以及XML属性 列表。将属性列表 的静态表示形式转换回对象图形时,还可让您更灵活地指定这些对象是可变的还是不可变的。

0

几点。

  1. NSUserDefaults可能只是一个大plist,所以为什么要使用它?将条目粘贴到保存内存结构的单例中。
  2. 如果您是在第一次加载时执行此操作,因为您希望它是可变的,请将默认值放入资源文件夹中。当你想加载它时,检查你是否在文档文件夹中,如果你没有(第一次加载),将它从资源包复制到文档。
  3. 如果您使用NSUserDefaults进行持久化,只需在applicationShouldResignActive和任何其他进行重要更改的时间将数据写入您的plist。
  4. 写在后台线程,但你可能需要在这里做一些锁定。
  5. 当加载和保存时间变得很大时,最佳实践可能会转移到核心数据,但在你需要这样做之前,1-4应该给你更多的里程。
相关问题