15

Dlaczego buforuje odpowiedzi. Zwraca wcześniej pobrane odpowiedzi. Działa nawet po wyłączeniu połączenia sieciowego. Zresetowanie symulatora iOS również nie działa. Złożenie wniosku, a następnie ponowne połączenie z Internetem działa (buforowane).Zapobiegaj buforowaniu odpowiedzi przez NSURLSession

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() 
} 

Aktualizacja

udało mi się go rozwiązać poprzez wywołanie tego kodu z didFinishLaunching w AppDelegate:

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

Jednak wciąż jestem ciekaw dlaczego mój oryginalny kod nie działa . Czułbym się też nieco brzydki, aby wyłączyć pamięć podręczną dla całej aplikacji, aby rozwiązać mój problem.

+0

Dzięki !! Czy odkryłeś coś więcej na ten temat? –

+2

dodaj 'configuration.URLCache' do' nil' podczas tworzenia obiektu 'NSURLSessionConfiguration', a odpowiedzi nie będą buforowane. – execv

Odpowiedz

13

Dzięki za pytanie. Położył mnie na właściwej ścieżce.

Istnieje więcej możliwości dzięki NSURLCache.sharedURLCache() i nie ma potrzeby zmiany pojemności pamięci i pojemności dysku.

Możesz usunąć wszystkie buforowane odpowiedzi. Działa dla mnie.

NSURLCache.sharedURLCache().removeAllCachedResponses() 

Lub możesz usunąć pamięć podręczną dla pojedynczej odpowiedzi. Nie działa na mnie iOS 9.

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

//Do your request here 

Mam nadzieję, że ktoś pomaga się!

Edit: NSURLCache.sharedURLCache().removeCachedResponseForRequest(request) nie działa dla mnie niestety

Moja alternatywą było: Używam tego za pociągnięciem do odświeżenia i jestem śledzenia datę ostatniej aktualizacji. Użyłem więc następującego kodu:

NSURLCache.sharedURLCache().removeCachedResponsesSinceDate(lastUpdate) 

Ale z jakiegoś powodu to nie działa eter.

Od iOS 8, pojedynczy cache usunąć metod wydaje się być uszkodzony: https://stackoverflow.com/a/26343653/2826164

+0

Użyłem alternatywy dla usunięcia buforowanej odpowiedzi dla konkretnego żądania, resetu buforowanej odpowiedzi, zobacz moją odpowiedź w tym poście http://stackoverflow.com/a/36507745/1080583 –

+0

Czy wiesz, czy to działa na symulator inaczej niż dla rzeczywistego urządzenia? Użyłem tego podejścia, a na symulatorze nawet usunięcie całej pamięci podręcznej podczas rozmowy do 'applicationWillResignActive' nadal pozostawia pełny plik Cache.db. –

+0

Testowałem to tylko na urządzeniu. Możesz spróbować wyczyścić pamięć podręczną xCode, może to da inny wynik w de symulatorze (wyczyścić pamięć podręczną xCode cmd + alt + shift + K) –

8

Nie wiem, czy to rzeczywiście zapobiega chaching lub po prostu zmusza świeżym Reload za każdym razem, ale to jest to, co pracował dla mnie:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

Oto zrzut ekranu pokazujący inne opcje w przypadku gdy ktoś może ich potrzebować:

enter image description here

Powiązane problemy