针对网络请求和离线使用优化iOS应用

时间:2017-02-05 11:57:48

标签: ios swift alamofire nsurlcache

我即将开始优化我的应用程序,以便发出HTTP请求以及添加对离线使用的支持。

一般的想法是,如果数据已经在缓存中可用,我想让应用程序尽可能顺利,而无需用户等待网络请求。

如果我设置NSURLCache标题让我们说一天,这将由开箱即用的Cache-Control处理。问题是服务器资源有时会发生变化(每天,每周或每月),因此用户将拥有旧数据。然而,如果缓存中至少存在某些内容,我仍然希望用户不必等待数据,因为这些数据很可能是最新的。

因此,我正在考虑实施以下解决方案:

  1. 尝试强制加载缓存returnCacheDataDontLoad
  2. 中的数据
  3. 向用户显示此数据(无需等待数据加载 本地缓存)
  4. 执行第二个请求,以便从服务器加载资源 忽略缓存reloadIgnoringLocalCacheData
  5. 在步骤13
  6. 加载的数据之间进行差异化
  7. 根据步骤4
  8. 中的差异更新屏幕上的数据

    强制从缓存(Alamofire)加载数据:

    let configuration = URLSessionConfiguration.default
    configuration.requestCachePolicy = .returnCacheDataDontLoad
    
    self.sessionManager = Alamofire.SessionManager(configuration: configuration)
    sessionManager!.request(.....)
    

    强制从服务器加载数据:

    let configuration = URLSessionConfiguration.default
    configuration.requestCachePolicy = .reloadIgnoringLocalCacheData
    
    self.sessionManager = Alamofire.SessionManager(configuration: configuration)
    
    sessionManager!.request(.....)
    

    如果有人能够对提议的解决方案发表评论并批评它或提出差异解决方案,我真的很感激,因为我真的想以正确的方式做到这一点。

    提前谢谢

1 个答案:

答案 0 :(得分:0)

根据评论中的要求,以下是我最终提出的解决方案:

我没有使用NSURLCache,而是使用Realm(link)编写自己的'缓存层'。他们有一个非常好的API,基本上你可以开箱即用的数据同步。它们还有一个Realm通知(观察者模式)的概念,无论何时数据发生变化,你都会得到一个带有diff的回调。