iOS - 使用 AFNetworking 保存和持久化 JSON 结果的策略

Posted

技术标签:

【中文标题】iOS - 使用 AFNetworking 保存和持久化 JSON 结果的策略【英文标题】:iOS - Strategy for saving and persisting JSON results with AFNetworking 【发布时间】:2013-03-02 00:14:16 【问题描述】:

我正在编写一个从云端数据库加载菜单数据的 iPhone 应用程序。我正在使用 AFNetworking(特别是 AFJSONRequestOperation)下载 appDelegate 中的数据。

到目前为止一切正常,但我还需要应用程序能够在应用程序离线时加载菜单。为了处理这个问题,我想在 AFJSONRequestOperation 调用检索到返回的 JSON 数据后将其保存到磁盘。

我最初的策略是将返回的 JSON 保存为字符串,但我找不到从 AFJSONRequestOperation 获取字符串响应的方法。对 Web 服务进行两次调用(一个返回 JSON 对象,另一个返回文本)似乎很愚蠢,尽管这很简单。我想知道是否有更好或更有效的方法来做到这一点。我可以跳过 AFJSONRequest 并选择一个普通的 AFHttpRequest,但是我需要手动构造 JSON 对象。

还有比我想出的两个更好的选择吗?在我看来,正确的答案将涉及构造 JSON 对象并允许我访问原始文本响应的单个调用,但我愿意听取替代方案。

【问题讨论】:

【参考方案1】:

不要将其保存为 JSON 字符串级别。 AFNetworking 将根据您的 JSON 结构将 JSON 作为 NSArray 或 NSDictionary 返回。

您可以将数组或字典保存为 plist。

-[NSDictionary writeToURL:atomically:]-[NSArray writeToURL:atomically:]

【讨论】:

这对我来说很有意义.. 感谢您的意见。但是,为什么我会使用 writeToURL 来反对 writeToString? @itslittlejohn 我不确定你在说什么 writeToString 方法。 AFNetworking、NSJSONSerialization、NSDictionary 或 NSArray 中没有 writeToString。 对不起.. 我的意思是 writeToFile 方法,而不是 writeToString。我最终使用了 writeToFile。 @itslittlejohn 好的。是的,对于以“file:///”为前缀的 URL,没有区别。我首先想到 -writeToURL:atomically: 主要是出于习惯。【参考方案2】:

我会尝试使用 NSJSONSerialization 将 NSData 保存到磁盘。

示例:

NSData *dataToSave =  [NSJSONSerialization dataWithJSONObject:responseObject options:nil error:nil];

id jsonObject = [NSJSONSerialization JSONObjectWithData:dataToSave options:nil error:nil];

另一种选择是从 AFNetworking 获取您的 responseObject。大概是一个格式良好的 NSDictionary 并简单地将其放在 NSUserDefaults 中以进行半持久存储。您需要确保您的字典中没有任何空值,因为 NSUserDefaults 不能很好地处理空值。

【讨论】:

我考虑过使用 NSUserDefaults,但似乎最好为用户偏好保留默认值。你认为这比保存 Plist 更好吗?

以上是关于iOS - 使用 AFNetworking 保存和持久化 JSON 结果的策略的主要内容,如果未能解决你的问题,请参考以下文章

iOS 使用 NSOperationQueue 和 AFNetworking 实现多下载功能

AFNetworking 仅在请求成功时下载和保存数据

iOS 使用AFNetworking 设置cookie

缓存策略,AFNetworking

使用 AFNetworking 在 iOS 8 中登录时解析服务器提供未经授权的 (401)

AFNetworking 和 Swift - 保存 json 响应