【问题标题】:Best practice to process big plists?处理大型 plist 的最佳实践?
【发布时间】:2013-05-02 19:35:57
【问题描述】:

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

【问题讨论】:

  • 你知道你几乎没有任何优势地重新生成 plist 吗? NSUserDefaults 也将信息存储在 plist 中。
  • 您可以在 GCD 队列中完成所有工作。从一开始就创建一个普通的后台队列,给它一个块来完成你的 plist 工作。就像@H2CO3 建议的那样,将所有内容放在 NSUserDefault 中,并根据需要创建获取数据的方法。不需要放在两个地方。
  • 这是因为你有很多很多的小数据,还是因为你有一些巨大的 NSData 对象?您不应该将它们保存在 plist(或 NSUserDefaults,它本身就是一个 plist)中。
  • 为什么不直接将 plist 文件复制到应用程序支持并通过NSDictionary 而不是通过NSUserDefaults 加载它?
  • NSUserDefaults 不是为保存大量数据而设计的,为此我建议使用 sqlite3 数据库。

标签: ios objective-c plist


【解决方案1】:

您可能会从将 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 属性 列表。当您转换属性列表的静态表示时 回到对象图,它还可以让您指定更多 无论这些对象是可变的还是不可变的,都具有灵活性。

【讨论】:

    【解决方案2】:

    几点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多