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

标签 ios swift alamofire nsurlcache

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

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

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

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

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

强制从缓存中加载数据(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) 编写了自己的“缓存层”。他们有一个非常好的 API,基本上你可以开箱即用地同步数据。他们还有一个 Realm 通知(观察者模式)的概念,只要你的数据发生变化,你就会得到一个带有差异的回调。

关于ios - 在网络请求和离线使用方面优化 iOS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42051763/

相关文章:

ios - CocoaPods AmazonMobileHub 架构 x86_64 的 undefined symbol

ios - 如何在 swift 中使用 mvvm 合并两个数据源模型

ios - 屏幕发送不适用于 GoogleAnalytics iOS SDK 3.11

ios - 如何将 UIImagePicker 与带有按钮和 UIImageView 的自定义单元格一起使用?

ios - tableHeaderView UISearchBar 不显示

ruby-on-rails - Devise_token_auth - 无法运行 Controller 操作

swift - 等效的 Swift NSURLSession 或 Alamofire Curl 帖子

ios - nsmutableArray 用最后添加的对象替换元素

ios - 我想在与 api 数据对应的标签中将可用时间显示为粗体和不可用时间(罢工)

ios - 如何通过数组访问.csv文件目录