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 实现多下载功能