ios - 在 iOS 中处理和持久化 JSON 数据的选项
问题描述
我正在使用一个 iOS 应用程序,该应用程序使用 REST API 连接到后端服务器以检索配置数据。配置数据以 JSON 格式接收,并最终使用 NSUserDefaults 保存在本地。一条配置数据的一般流程如下:
- 从 http 客户端接收 NSData
- 使用 NSJSONSerialization 从 NSData 解析 json,结果是一个 NSDictionary 实例
- 将json数据映射成本地使用的结构,result是一组代表数据的配置对象
- 使用 NSKeyedArchiver 将配置对象持久化到 NSData 实例(配置对象实现 NSCoding)。
- 将 NSData 存储到 NSUserDefaults
配置数据是相当静态的(它不会随着时间的推移发生太大变化),但应用程序确实需要每隔一段时间(即 30 分钟)刷新一次。迄今为止的方法是每次只转储和替换本地数据,而不是尝试实现需要完全重新设计的增量更新。
只要配置数据相当小,这种方法似乎就可以正常工作。但是,最近我们看到了大于 20MB 的 JSON 配置数据。在这些情况下,上述方法不起作用,因为它似乎需要太多内存来处理端到端。在 xcode 性能选项卡中,应用程序的内存峰值超过 500MB,并且进程通常会崩溃,至少在旧设备(即 iPhone 6)上是这样。
在我开始重新设计整个过程之前,我想知道是否有更多的优化仍然允许转储和替换,但内存占用更小。如果需要映射,是否有更有效的方法可以从 HTTP 响应到某种持久存储?核心数据是否非常适合转储和替换方法?我想不是。
解决方案
如果内存是您主要关心的问题,您可以查看https://github.com/stig/json-framework,它可以让您以“分块”方式进行解析,因此您不需要将整个 JSON 文档放入随时记忆。
推荐阅读
- php - var_dump(object) 结果“*RECURSION*”
- reactjs - 当 setState 从测试类调用时,render() 没有被调用?
- java - netbeans:根据选定的组合框项目将数据库字段调用到标签中
- swift - 快速创建空文件
- android - 为 Viger-PDF 添加依赖项时无法合并 dex 错误
- python - QPython 中的 KDB+ 查询:基于 DataFrame 列表的过滤器
- reactjs - 如何在 ReactJS 中使用换行符设置 textarea 值
- multiprocessing - 在辅助处理器、预引导或 DOS 中执行简单代码
- javascript - 预期的 JS 声明或语句 - 在 asp.net 中的脚本标记下
- selenium-webdriver - 如何在硒的单个xpath中获取多个值