在iOS中处理和持久化JSON数据的选项

时间:2019-01-28 15:52:03

标签: ios json nsuserdefaults

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

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

配置数据是相当静态的(随时间变化不大),但应用程序确实需要经常刷新(即30分钟)。到目前为止,方法是每次都仅转储和替换本地数据,而不是尝试实施需要完全重新设计的增量更新。

只要配置数据很小,此方法似乎就可以正常工作。但是,最近我们看到JSON大于20MB的配置数据。在这些情况下,上面概述的方法不起作用,因为它似乎需要太多内存才能进行端到端处理。在“ xcode性能”标签中,该应用的内存峰值超过500MB,并且该过程通常会崩溃,至少在较旧的设备(例如iPhone 6)上会崩溃。

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

2 个答案:

答案 0 :(得分:0)

如果主要考虑内存,则可以看看https://github.com/stig/json-framework,它使您能够以“块式”方式进行解析,因此您无需随时将整个JSON文档存储在内存中。

答案 1 :(得分:0)

我认为将数据保存到CoreData或SQLight是一个好主意,而不是保存到userdefaults。这可能会解决您的问题,因为并非所有数据都已加载到内存中以供访问。