处理大型钳子的最佳做法?

时间:2013-05-02 19:35:58

标签: ios objective-c plist

我正在使用plist文件,其中包含我的所有应用数据。该文件非常大,目前我在首次启动时将所有内容加载到Arrays和Dictionaries中并将它们保存到UserDefaults中,这样我就不必再次触摸plist了。因为这需要大约10秒(iP4),我想知道是否有更快(更好)的方式来处理plist。我用仪器检查了整个初创公司,并且通过数百个条目实际上是最快的部分。将这些已处理的内容保存到NSUserDefaults中需要很长时间。

2 个答案:

答案 0 :(得分:0)

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

请参阅:

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

来自Apple的物业清单编程指南:

  

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

答案 1 :(得分:0)

有几点。

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