在网络请求和离线使用方面优化 iOS 应用

Optimizing iOS app in regards to network requests and offline usage

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

总体思路是,如果数据已在缓存中可用,我希望让应用尽可能流畅,而无需用户等待网络请求。

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

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

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

强制从缓存中加载数据(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(.....)

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

提前致谢

根据评论中的要求,这是我最终得到的解决方案:

我没有使用 NSURLCache,而是使用 Realm (link) 编写了自己的 'caching layer'。他们有一个非常好的 API,基本上你可以开箱即用地同步数据。他们还有一个 Realm 通知(观察者模式)的概念,只要你的数据发生变化,你就会得到一个带有差异的回调。