2014-06-30 14 views
5

Verwenden Sie NSURLSession Standard-Caching, wie kann ich den Cache für eine bestimmte URL ungültig machen?Wie mache ich den iOS-Cache für eine bestimmte URL ungültig?

Ich nehme zur Kenntnis NSURLCache ‚s removeCachedResponseForRequest: Methode, aber das nimmt ein NSURLRequest Objekt, das ich für die ursprüngliche Anfrage nicht haben. Muss ich diese so speichern, wie ich sie erstelle, damit ich sie dann wieder an removeCachedResponseForRequest: weitergeben kann oder kann ich einfach eine neue mit der entsprechenden URL erstellen, die dann als äquivalent für den Zweck dient, auch wenn sie nicht die gleiche hat Headerfelder und andere Eigenschaften als das Original?

Antwort

3

Die Lösung stellt sich heraus, nicht den Cache für eine vorhandene URL zu entkräften, sondern setzen:

request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

Wenn Sie die nächste Anforderung für die Ressource machen Sie wissen, für ungültig. Es gibt Optionen, um nur den lokalen Cache zu ignorieren oder zu verlangen, dass Upstream-Proxys ihre Caches ebenfalls ignorieren. Einzelheiten finden Sie in der Dokumentation NSURLRequest/NSMutableURLRequest.

5

Wenn Sie weitergehen möchten, können Sie die zwischengespeicherte Antwort für die URL-Anforderung zurücksetzen, die das Neuladen erzwingen soll. die folgenden Aktionen ausführen:

let newResponse = NSHTTPURLResponse(URL: urlrequest.URL!, statusCode: 200, HTTPVersion: "1.1", headerFields: ["Cache-Control":"max-age=0"]) 
let cachedResponse = NSCachedURLResponse(response: newResponse!, data: NSData()) 
NSURLCache.sharedURLCache().storeCachedResponse(cachedResponse, forRequest: urlrequest) 

Als Cache-Control-Header der Antwort ein Höchstalter von 0 Hax (Zwangs-) die Antwort wird nie zurückgegeben werden, wenn Sie diese Anforderung tun.

Ihre Antwort funktioniert gut, um eine einzelne Anfrage zu erzwingen, aber wenn Sie zwei Versionen der Anfrage haben wollen, eine forcierend und eine andere abhängig von der zwischengespeicherten Antwort, entfernen Sie die zwischengespeicherte, sobald Sie eine Anfrage erzwingen.

+0

Aus Neugier, hat das tatsächlich für Sie funktioniert? Ich versuche, diese Methode des manuellen Zurücksetzens der zwischengespeicherten Antwort mit Swift 2.2 auf iOS 9.3 zu verwenden. Das Ausführen von 'NSURLCache.sharedCache() .cachedResponseForRequest (...)' gibt jedoch weiterhin eine zwischengespeicherte Antwort zurück. –

+0

@ClayEllis gut, die letzte Version der App läuft 2.2 und funktioniert gut in der Produktion, ich habe jedoch keinen Zugriff auf den Code mehr. Setzen Sie den Cache-Steuerkopf so, dass er eine Lebensdauer von Null hat? –

+0

Ja, ich mache genau das, was Sie oben getan haben. Würde 'NSURLCache' jemals eine zwischengespeicherte Antwort zurückgeben, obwohl das' max-age' auf Null gesetzt ist? –

1

Hier ist, was für mich gearbeitet hat:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

Hier sind alle aufgeführten Optionen in Bezug auf chache Politik, so dass Sie Ihre Notwendigkeit ein, dass eine bessere Anzüge finden:

enter image description here

Verwendung Swift 2.2 und Xcode 7.3