【问题标题】:Best way to Cache JSON from API in SWIFT?在 SWIFT 中从 API 缓存 JSON 的最佳方法?
【发布时间】:2015-11-21 09:49:23
【问题描述】:

我需要快速缓存来自 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. 我将在表格视图中填充已解析的数据。它在用户在线时工作。

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

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

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

请建议我实现这一目标的最佳方法...

【问题讨论】:

    标签: ios json swift caching alamofire


    【解决方案1】:

    你可以使用这个缓存开源。它在磁盘和内存上缓存数据。可以缓存很多swift类型,以及继承NSObject并符合NSCoding协议的自定义类。

    https://github.com/huynguyencong/DataCache

    实施: 首先,它使用 NSCache 作为内存缓存。 NSCache 像字典一样使用。 其次,将缓存保存到磁盘,使用 NSFileManager 方法。

    【讨论】:

      【解决方案2】:

      您已经有许多工具可供您使用。

      NSURLCache

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

      当前的 Alamofire docs 涵盖了创建自定义 Manager 对象。

      将 JSON 下载到磁盘

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

      填充表格视图

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

      显然您没有“必须”将 JSON 解析为模型对象,但这有助于保护您的表格视图免受格式错误的 JSON 数据的影响。

      存储 JSON 以供离线使用

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

      离线使用

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

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

      鉴于您对原始问题的更新,我会推荐这种方法。

      【讨论】:

      • 感谢您提出一个好的方法。我可以在一定时间后刷新我的核心数据中的模型对象吗?
      猜你喜欢
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 2019-12-10
      相关资源
      最近更新 更多