web-dev-qa-db-fra.com

Empêcher NSURLSession de mettre en cache les réponses

Pourquoi cache-t-il les réponses? Il retourne les réponses précédemment récupérées. Cela fonctionne même si vous désactivez la connexion réseau. La réinitialisation du simulateur iOS ne semble pas fonctionner non plus. Faire une demande, puis encore avec Internet hors connexion fonctionne (en 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()
}

Mettre à jour

J'ai réussi à le résoudre en appelant ce code à partir de didFinishLaunching dans la AppDelegate:

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

Cependant, je suis toujours curieux de savoir pourquoi mon code original ne fonctionne pas. Il est également un peu moche de désactiver le cache de toutes les applications pour résoudre mon problème.

19
Sunkas

Merci pour la question. Cela m'a mis sur le bon chemin. 

NSURLCache.sharedURLCache() offre davantage de possibilités et vous n'avez pas besoin de modifier la capacité de mémoire et la capacité de disque pour cela.

Vous pouvez supprimer toutes les réponses en cache. Travaille pour moi.

NSURLCache.sharedURLCache().removeAllCachedResponses()

Ou vous pouvez supprimer le cache pour une seule réponse. Ne fonctionne pas pour moi iOS 9.

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

//Do your request here

J'espère que ça aide quelqu'un!

Edit:NSURLCache.sharedURLCache().removeCachedResponseForRequest(request) ne fonctionne pas pour moi malheureusement

Mon alternative était: J'utilise ceci pour tirer pour actualiser et je suis en train de suivre la dernière date de mise à jour. J'utilisais donc le code suivant:

 NSURLCache.sharedURLCache().removeCachedResponsesSinceDate(lastUpdate)

Mais pour une raison quelconque, cela ne fonctionne pas.

Depuis iOS 8, les méthodes de suppression de cache unique semblent rompues: https://stackoverflow.com/a/26343653/2826164

17
Gerrit Post

Je ne sais pas si cela empêche réellement le chachage ou force simplement une nouvelle recharge à chaque fois, mais voici ce qui a fonctionné pour moi:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

Voici une capture d'écran montrant d'autres options au cas où quelqu'un en aurait besoin:

 enter image description here

9
Andrej

J'implémenterais URLSessionDelegate et appellerais AchèvementBlock avec nil dans l'implémentation du délégué willCache. C'était vos demandes ne seront jamais brisées

0
Exception