【问题标题】:options for processing and persisting JSON data in iOS在 iOS 中处理和持久化 JSON 数据的选项
【发布时间】:2019-01-28 15:52:03
【问题描述】:

我正在使用一个 iOS 应用程序,该应用程序使用 REST API 连接到后端服务器以检索配置数据。配置数据以 JSON 格式接收,并最终使用 NSUserDefaults 保存在本地。一条配置数据的一般流程如下:

  • 从 http 客户端接收 NSData
  • 使用 NSJSONSerialization 从 NSData 解析 json,结果是一个 NSDictionary 实例
  • 将json数据映射到本地使用的结构中,结果是一组代表数据的配置对象
  • 使用 NSKeyedArchiver 将配置对象持久化到 NSData 实例(配置对象实现 NSCoding)。
  • 将 NSData 存储到 NSUserDefaults

配置数据是相当静态的(它不会随时间发生太大变化),但应用确实需要每隔一段时间(即 30 分钟)刷新一次。迄今为止的方法是每次只转储和替换本地数据,而不是尝试实现需要完全重新设计的增量更新。

只要配置数据相当小,这种方法似乎就可以正常工作。但是,最近我们看到了大于 20MB 的 JSON 配置数据。在这些情况下,上述方法不起作用,因为它似乎需要太多内存来处理端到端。在 xcode 性能选项卡中,应用程序的内存峰值超过 500MB,并且进程通常会崩溃,至少在旧设备(即 iPhone 6)上是这样。

在我开始重新设计整个过程之前,我想知道是否有更多优化仍然允许转储和替换,但内存占用更小。如果需要映射,是否有更有效的方法可以从 HTTP 响应到某种持久存储?核心数据是否非常适合转储和替换方法?我认为不是。

【问题讨论】:

  • 考虑使用 CloudKit 作为后端。它以最少的资源消耗提供最大的性能。
  • >20MB 的 JSON 数据太多了。如果数据在服务器端没有变化,为什么您的应用需要刷新?

标签: ios json nsuserdefaults


【解决方案1】:

如果内存是您主要关心的问题,您可以查看https://github.com/stig/json-framework,它可以让您以“分块”方式进行解析,因此您无需随时将整个 JSON 文档保存在内存中。

【讨论】:

    【解决方案2】:

    我认为将数据保存到 CoreData 或 SQLight 比保存到 userdefaults 更好。这可能会解决您的问题,因为并非所有数据都加载到内存中以供访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多