我需要快速缓存来自 API 的 json 数据。 所以我研究了很多并找到了这个 Post .
我尝试在我的应用程序中实现选项 1。但是自定义管理器总是返回零。不知道为什么?
之后我得到了AwesomeCache .它说它是一个很棒的 API 缓存。 但我不知道如何实现这个? 我提到了这个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 的最佳方法?
提前致谢!
更新
这是我的要求
从 API 获取 JSON 并解析 JSON 数据。这些可以在 Alamofire 和 SwiftyJSON 的帮助下完成
我将在 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/