2014-06-30 15 views
5

Utilizzando la memorizzazione nella cache predefinita di NSURLSession, come si annulla la cache per un URL particolare?Come si annulla la cache di iOS per un particolare URL?

Nota il metodo NSURLCacheremoveCachedResponseForRequest:, ma che accetta un oggetto NSURLRequest, che non ho per la richiesta originale. Devo archiviarli mentre li creo, quindi posso passarli nuovamente in removeCachedResponseForRequest: o posso semplicemente crearne uno nuovo con l'URL appropriato che servirà quindi come equivalente per lo scopo, anche se non ha lo stesso campi di intestazione e altre proprietà come l'originale?

risposta

3

La soluzione risulta non essere invalidare la cache per un URL esistente, ma per impostare:

request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

Quando si effettua la richiesta successiva per la risorsa che sapete essere valido. Esistono opzioni per ignorare solo la cache locale o per richiedere che i proxy upstream ignorino anche le loro cache. Vedere la documentazione NSURLRequest/NSMutableURLRequest per i dettagli.

5

Se si desidera andare oltre, è possibile ripristinare la risposta memorizzata nella cache per la richiesta di url che si desidera forzare la ricarica. Facendo la seguente:

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) 

Come l'intestazione Cache-Control della risposta Hax un'età massima di 0 (forzata) la risposta non verrà mai restituito quando si esegue questa richiesta.

La risposta funziona correttamente per forzare una singola richiesta, ma se si desidera che due richieste siano forzate e un'altra si basi sulla risposta memorizzata nella cache, rimuovere la cache una volta forzata una richiesta.

+0

Per curiosità, ha funzionato davvero per te? Sto cercando di utilizzare questo metodo per reimpostare manualmente la risposta in cache con Swift 2.2 su iOS 9.3. Tuttavia, facendo 'NSURLCache.sharedCache(). CachedResponseForRequest (...)' restituisce ancora una risposta memorizzata nella cache. –

+0

@ClayEllis bene, l'ultima versione dell'app è in esecuzione 2.2 e funziona bene in produzione, non ho più accesso al codice. Stai impostando l'intestazione del controllo cache per avere una durata zero? –

+0

Sì, sto facendo esattamente quello che hai fatto sopra. 'NSURLCache' restituirà mai una risposta memorizzata nella cache anche se' max-age' è impostato su zero? –

1

Ecco quello che ha lavorato per me:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

Qui ci sono tutte le opzioni elencate in materia di politica Chache, quindi si può trovare uno che si adatta meglio il vostro bisogno:

enter image description here

Utilizzando Swift 2.2 e Xcode 7.3