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