ios - 从 SWIFT 中的 API 缓存 JSON 的最佳方法?

标签 ios json swift caching alamofire

我需要快速缓存来自 API 的 json 数据。 所以我研究了很多并找到了这个 Post .

我尝试在我的应用程序中实现选项 1。但是自定义管理器总是返回零。不知道为什么?

之后我得到了AwesomeCache .它说它是一个很棒的 AP​​I 缓存。 但我不知道如何实现这个? 我提到了这个Issue .我还是想不通。

这是我当前的实现在没有缓存的情况下的样子:

Alamofire.request(.GET, "http://api.androidhive.info/volley/person_array.json")

    .responseJSON { (_, _, data, _) in
        let json = JSON(data!)
        let catCount = json.count
        for index in 0...catCount-1 {
            let name = json[index]["name"].string
            println(name)
         }

请建议我从 API 缓存 JSON 的最佳方法?

提前致谢!

更新

这是我的要求

  1. 从 API 获取 JSON 并解析 JSON 数据。这些可以在 Alamofire 和 SwiftyJSON 的帮助下完成

  2. 我将在 TableView 中填充已解析的数据。它在用户在线时起作用。

但我也想在用户离线时显示表中的数据。

所以我需要将解析后的数据或 JSON 数据保存在我的缓存中,并且我需要在一周或几天内刷新或使缓存过期。

我不喜欢将 JSON 存储在我的磁盘中,因为它会被更新。

请给我建议实现此目标的最佳方法...

最佳答案

您已经可以使用许多工具。

NSURL缓存

您所有的请求都已经存储在 NSURLSession 上的 NSURLSessionConfiguration 中的 NSURLCache 中存储在 sharedInstance 中Alamofire Manager 的。这些存储的请求已经遵循您正在访问的服务器提供的所有缓存策略规则。您可以通过在您自己的自定义上设置 requestCachePolicy 来控制缓存行为 NSURLSessionConfiguration .我还建议您阅读这篇很棒的 NSHipster 文章,它会带您了解 NSURLCache 的来龙去脉。以及如何控制它。

Creating custom Manager objects is covered in the current Alamofire docs.

将 JSON 下载到磁盘

您还可以使用 Alamofire.download 而不是使用 Alamofire.request 将 JSON 直接下载到磁盘。这会将负载下载到您在 destination 闭包中提供的 fileURL。这将使您能够完全控制该点之后的文件缓存。如果您想遵循服务器提供的缓存 header 规则,您需要在之后围绕这些文件创建自己的缓存策略。

填充 TableView

将数据下载到磁盘后,您需要将其加载到 NSData blob 并将其解析为 JSON 以填充您的 TableView 。这应该很简单。您需要在开始下载时指定给 Alamofire 的目标 NSURL。然后将文件数据加载到 NSData blob 中。最后,使用 NSJSONSerialization 将 NSData 对象转换为 JSON AnyObject,它可以被解析为模型对象以填充您的 TableView 。

Obviously you don't "have" to parse the JSON into model objects, but this helps protect your table view from malformed JSON data.

存储 JSON 以供离线使用

如果您坚持使用这种方法,您将需要在 CoreData 或 SQLite 等工具中跟踪您的缓存过期日期。您可以通过在磁盘上缓存 JSON 文件的路径,或将模型对象直接存储在 CoreData 或 SQLite 中来实现。这可能会变得相当复杂,我不推荐这种方法,除非你绝对不想缓存你的模型对象。

离线使用

通常,如果您需要缓存数据以供离线使用,您希望将模型对象存储在类似 CoreData 的对象中。您将使用 Alamofire request 方法和 responseJSON 序列化程序将数据解析为 JSON。然后将 JSON 转换为模型对象。从那里,您可以将模型对象保存在 CoreData 中,然后最终使用模型对象填充您的 TableView 。

这种方法的好处是,您可以缓存所有模型对象,以防设备离线时访问您的 TableView 。将此设计与对 NSURLCache 的查询相结合,以查看您的请求是否被缓存,让您在已经生成模型对象时避免不必要的服务器调用和解析逻辑。

Given the updates to your original question, I would recommend this approach.

关于ios - 从 SWIFT 中的 API 缓存 JSON 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32242148/

相关文章:

objective-c - 尝试加载有关方向更改的新 View

java - JSONObject 到文档

Java - 如何从 JSON Schema 获取所有字段名称

ios - 创建带有动态单元格的tableView并以编程方式设计的方法

ios - 返回数组的函数没有在 for 循环 Swift 中获取附加内容

ios - 从模态调用呈现viewcontroller的方法

ios - 便利初始化器的用例是什么?

ios - Cordova 编译错误

javascript - YUI "Get"解析 JSON 响应的实用程序?

swift - 在 generate-xcodeproj 之后,哪些步骤可以将 SPM 生成的 Xcode 项目静态链接为另一个 Xcode 项目中的子项目?