【问题标题】:NSURLSession is NOT caching requestsNSURLSession 不缓存请求
【发布时间】:2016-02-15 12:10:12
【问题描述】:

我想缓存我的 api 响应 json,以便用户可以在离线模式下继续使用该应用程序。但是,结果没有被缓存,并且当我关闭 WiFi 时会显示错误警报。

 let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
        guard (data != nil) else {
          self.showConnectionErrorAlert()
          return
        }
 }

task.resume()

这就是我配置我的 NSURLCache 的方式:

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let cacheSizeMemory = 500*1024*1024; // 500 MB
    let cacheSizeDisk = 500*1024*1024; // 500 MB
    let sharedCache = NSURLCache.init(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "nsurlcache")
    NSURLCache.setSharedURLCache(sharedCache)
    sleep(1);


    return true
  }

这是在线时的响应头:

可选({ 网址: http://api.nytimes.com/svc/search/v2/articlesearch.json?&page=2&fq=document_type:(article)&sort=newest&api-key=32a4d3342b658b316d4b1369d04a6e5b:16:73440927 } { 状态码:200,标题 { “访问控制允许凭据”= true; “访问控制允许来源”=“*”; “内容长度”= 20212; “内容类型”=“应用程序/json;字符集=UTF-8”; 日期 =“格林威治标准时间 2015 年 11 月 13 日星期五 20:02:49”; 服务器=“nginx/1.4.1”; Vary = "接受编码"; “X 缓存”= MISS; “X-Mashery-Responder”=“prod-j-worker-atl-04.mashery.com”; "X-Powered-By" = "PHP/5.3.27"; } })

离线时出现以下错误:

可选(错误域=NSURLErrorDomain Code=-1009 "互联网 连接似乎已脱机。” UserInfo={NSErrorFailingURLStringKey=http://api.nytimes.com/svc/search/v2/articlesearch.json?&page=1&fq=document_type:(article)&sort=newest&api-key=32a4d3342b658b316d4b1369d04a6e5b:16:73440927, _kCFStreamErrorCodeKey=8, NSErrorFailingURLKey=http://api.nytimes.com/svc/search/v2/articlesearch.json?&page=1&fq=document_type:(article)&sort=newest&api-key=32a4d3342b658b316d4b1369d04a6e5b:16:73440927, NSLocalizedDescription=互联网连接似乎离线。, _kCFStreamErrorDomainKey=12, NSUnderlyingError=0x7bfd1360 {错误域=kCFErrorDomainCFNetwork 代码=-1009 "(null)" UserInfo={_kCFStreamErrorDomainKey=12, _kCFStreamErrorCodeKey=8}}})

【问题讨论】:

  • 响应被缓存,而不是请求。响应头是什么?
  • @Wain,我已经用响应标题编辑了问题

标签: ios swift caching


【解决方案1】:

服务器响应不包含任何缓存标头,因此不会缓存任何内容。

如果要添加到缓存中,则需要更改服务器发送的响应标头或手动将响应添加到缓存中。完成此操作后,您可以在请求中设置 cachePolicy 以指示应如何以及何时使用缓存(因为缓存可能已过期)。

let newCachedResponse = NSCachedURLResponse(response:response, data:response.data, userInfo:nil, storagePolicy:XXX)
    NSURLCache.sharedURLCache().storeCachedResponse(newCachedResponse, forRequest:request)

【讨论】:

  • 您能展示如何更改缓存标头或手动将响应添加到缓存中吗?
  • 我实现了 func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, willCacheResponse提出响应: NSCachedURLResponse, completionHandler: (NSCachedURLResponse!) -> Void) 但它没有被调用,因为没有缓存头
猜你喜欢
  • 2015-02-28
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 2018-04-27
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多