2015-11-13 111 views
0

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

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, “Access-Control-Allow-Credentials”= true; “Access-Control-Allow-Origin”=“*”; “Content-Length”= 20212; “Content-Type”=“application/json; charset = UTF-8”; 日期=“2015年11月13日星期五20:02:49 GMT”; Server =“nginx/1.4.1”; Vary =“Accept-Encoding”; “X-Cached”= MISS; “X-Mashery-Responder”=“prod-j-worker-atl-04.mashery.com”; “X-Powered-By”=“PHP/5.3.27”; }})

这里是错误时离线:

可选(错误域= NSURLErrorDomain代码= -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 “(空)” 的UserInfo = {_ kCFStreamErrorDomainKey = 12,_kCFStreamErrorCodeKey = 8}}})

+0

响应被缓存,而不是请求。什么是响应标题? – Wain

+0

@Wain,我用回应标题编辑了这个问题 – etayluz

回答

1

服务器响应不包含任何缓存头,所以什么都不会被缓存。

如果要添加到缓存中,则需要更改服务器发送的响应头或手动将响应添加到缓存。一旦你这样做了,你可以根据请求设置cachePolicy来规定应该如何以及何时使用缓存(因为缓存可能已经过期)。

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

你能说明如何改变缓存头或手动添加响应到缓存吗? – etayluz

+0

我实现了func URLSession(会话:NSURLSession,dataTask:NSURLSessionDataTask,willCacheResponse suggestedResponse:NSCachedURLResponse,completionHandler:(NSCachedURLResponse!) - > Void),但它没有被调用,因为没有缓存头 – etayluz