【发布时间】: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