2015-06-09 4 views
10

Ich setze die Cache-Richtlinie so, dass sie in Alamofire anfordert, den lokalen Cache zu ignorieren.Alamofire wird aus dem Cache geladen, auch wenn die Cache-Richtlinie auf ReloadIgnoringLocalAndRemoteCacheData gesetzt ist

Dann lade ich einen Viewcontroller mit Netzwerkverbindung, dann trenne ich die Netzwerkverbindung, kille die App und starte sie erneut.

Jetzt wird kein Netzwerk verfügbar Fehler wird nicht angezeigt (dh alamofire erstellt nicht Nserror-Objekt) erstellt, stattdessen App ausgeführt, als ob die Anforderung erfolgreich Daten aus dem Cache offensichtlich. Und die seltsame Sache ist, wenn ich versucht, die zwischengespeicherten Daten zu überprüfen mit

NSURLCache.sharedURLCache().cachedResponseForRequest(request) 

nil obwohl die Daten zurückgegeben wurde aus dem Cache ..

der einzige Weg, ich Antworten zwischengespeichert verhindern könnte, ist führen 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 

    } 

} 
} 

Was ich tun möchte, ist das Laden von Daten aus dem Cache nur, wenn Netzwerkverbindung nicht verfügbar ist, so etwas wie begrenzte Offline-Modus.Wie mache ich das?

Antwort

10

Ich verwende diese Art und Weise in einem Projekt und es funktioniert:

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... 

Hoffe, es hilft.

+0

Danke. Das hat perfekt funktioniert. – iksnae

+0

Was ist eine Anfrage? –

+0

@HongZhou Es ist eine bequeme Methode von Alamofire. Sie können es als 'Alamofire.request (mutableURLRequest) .validate() verwenden. ResponseJSON {Antwort in ...' –

1

Dank @ FábioSalata ich mein Problem wie dieses Problem gelöst.

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 ... 
Verwandte Themen