Alamofire loading from cache even when cache policy set to ReloadIgnoringLocalAndRemoteCacheData

23.6k views Asked by At

I set cache policy to request in Alamofire to ignore local cache.

Then I load a viewcontroller with network connection, then I disconnect network connection, kill the app and run it again.

Now no network available error is not shown(ie alamofire doesnt create nserror object) created, instead app runs as if the request succeeded getting data from cache obviously.And the odd thing is the when I tried to inspect the cached data using

NSURLCache.sharedURLCache().cachedResponseForRequest(request)

nil is returned eventhough the data was from cache ..

The only way I could prevent cached responses is perform NSURLCache.sharedURLCache().removeAllCachedResponses()

    let request = NSURLRequest(URL: NSURL(string: url)!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 100)

    Alamofire.manager.request(method, request, parameters:params)
    .responseJSON { (request, response, data, error) in
        if let anError = error {
            if anError.code == NSURLErrorNotConnectedToInternet {
                UIAlertView(title: "Alert", message: "No Network Connection Available", delegate: nil, cancelButtonTitle: "ok").show()
            }    

        } else if let data: AnyObject = data {
            println(NSURLCache.sharedURLCache().cachedResponseForRequest(request))
 //prints nil

    }

} 
}

What I want to do is load data from cache only if network connection is not available, something like limited offline mode.How to do this?

3

There are 3 answers

3
Fábio Salata On BEST ANSWER

I'm using this way in a project and it's working:

let mutableURLRequest = NSMutableURLRequest(URL: SERVICEURL)
mutableURLRequest.HTTPMethod = "POST"

mutableURLRequest.HTTPBody = self.createJson()
mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
mutableURLRequest.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

request(mutableURLRequest).validate().responseJSON{ response in...

Hope it helps.

1
Ahmet Sina Ustem On

Thanks to @FábioSalata I solved my problem like this.

 var req = URLRequest(url: URL(string: "<URL>")!)
 req.httpMethod = "GET"
 req.setValue("application/json", forHTTPHeaderField: "Content-Type")
 req.setValue("<Auth KEY>", forHTTPHeaderField:"Authorization" )
 req.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

 Alamofire.request(req).validate().responseJSON { response in ...
2
robinkunde On

ReloadIgnoringLocalAndRemoteCacheData is not implemented.

https://developer.apple.com/reference/foundation/nsurlrequestcachepolicy/1408722-reloadignoringlocalandremotecach

http://nshipster.com/nsurlcache/

Update: Starting with iOS 13, NSURLRequest.CachePolicy.reloadRevalidatingCacheData and NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData are implemented. https://developer.apple.com/documentation/ios_ipados_release_notes/ios_13_release_notes