15

Perché memorizza le risposte nella cache. Restituisce le risposte recuperate in precedenza. Funziona anche se si spegne la connessione di rete. Anche il reset del simulatore iOS non sembrava funzionare. Fare una richiesta, poi di nuovo con internet offline funziona (cache).Prevenzione di NSURLSession dalle risposte di memorizzazione nella cache

public let urlSession: NSURLSession 

public init() 
{ 
    // ... 

    var configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    configuration.requestCachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData 
    urlSession = NSURLSession(configuration: configuration) 
} 

func makeRequest(path: String, httpMethod:String, body:String?, baseUrl: String?, headers:[String:String]=[:], callback: JsonRequestCallback) 
{ 
    let urlString = (baseUrl ?? customOAuth2Manager.API_URL) + path 
    let url = NSURL(string: urlString) 
    let request = oauthInstance.request(forURL: url!) 

    request.HTTPMethod = httpMethod 
    self.customOAuth2Manager.setupRequest(request) 

    for (key, value) in headers { 
     request.setValue(value, forHTTPHeaderField:key) 
    } 

    if let body = body where body != "" { 
     let postData = (body as NSString).dataUsingEncoding(NSUTF8StringEncoding) 
     request.HTTPBody = postData 
    } 

    let task = urlSession.dataTaskWithRequest(request) { data, response, error in 
     self.parseData(data, response:response, error:error, body:body, callback: callback) 
    } 
    task.resume() 
} 

Aggiornamento

sono riuscito a risolverlo chiamando questo codice da didFinishLaunching nel AppDelegate:

func removeUrlCache() 
{ 
    NSURLCache.setSharedURLCache(NSURLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)) 
} 

Tuttavia, io sono ancora curioso di sapere perchè il mio codice originale non funziona . Sembra anche un po 'brutto disabilitare la cache di tutte le app per risolvere il mio problema.

+0

Grazie !! Hai scoperto di più su questo? –

+2

aggiungere 'configuration.URLCache' a' nil' quando si crea l'oggetto 'NSURLSessionConfiguration' e le risposte non verranno memorizzate nella cache. – execv

risposta

13

Grazie per la domanda. Mi ha messo sulla strada giusta.

Ci sono più possibilità con NSURLCache.sharedURLCache() e non è necessario modificare la capacità di memoria e la capacità del disco per questo.

È possibile rimuovere tutte le risposte memorizzate nella cache. Funziona per me.

NSURLCache.sharedURLCache().removeAllCachedResponses() 

Oppure è possibile rimuovere la cache per una singola risposta. non funziona per me iOS 9.

let request = NSURLRequest(URL: NSURL(string:url)!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData , timeoutInterval: 10) 
NSURLCache.sharedURLCache().removeCachedResponseForRequest(request) 

//Do your request here 

Spero che aiuta qualcuno fuori!

Edit: NSURLCache.sharedURLCache().removeCachedResponseForRequest(request) non funziona per me purtroppo

La mia alternativa era: Sto usando questo per tirare per aggiornare e sto monitoraggio l'ultima data di aggiornamento. Quindi stavo usando il seguente codice:

NSURLCache.sharedURLCache().removeCachedResponsesSinceDate(lastUpdate) 

Ma per qualche motivo questo non funziona etere.

Dal iOS 8, singola cache rimuovere metodi sembra essere rotto: https://stackoverflow.com/a/26343653/2826164

+0

Ho usato un'alternativa per rimuovere una risposta nella cache per una richiesta specifica, resettando la risposta nella cache, vedere la mia risposta in questo post http://stackoverflow.com/a/36507745/1080583 –

+0

Sai se funziona per simulatore in modo diverso rispetto a per dispositivo reale? Ho usato questo approccio, e sul simulatore anche la rimozione di tutta la cache durante la chiamata a 'applicationWillResignActive' lascia ancora il file Cache.db completo. –

+0

L'ho provato solo sul dispositivo. Puoi provare a pulire la cache di xCode forse questo darà un risultato diverso in de simulator (per pulire cache xCode cmd + alt + shift + K) –

8

Non sono sicuro se questo in realtà impedisce di chaching o solo costringe un ricaricamento fresco ogni volta, ma questo è ciò che ha funzionato per me:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

Ecco uno screenshot che mostra altre opzioni nel caso in cui qualcuno potrebbe averne bisogno:

enter image description here

Problemi correlati