2014-06-20 15 views
27

W mojej aplikacji na iOS używam NSURLSessionTask, aby pobrać dane json do mojej aplikacji. Odkryłem, że kiedy wywołuję adres URL bezpośrednio z przeglądarki, otrzymuję aktualny json i kiedy jest on wywoływany z poziomu aplikacji, otrzymuję starszą wersję jsona.Jak wyłączyć buforowanie z NSURLSessionTask

Czy dzieje się tak z powodu buforowania? Jak mogę powiedzieć NSURLSessionTask, aby nie używać buforowania.

Jest to wezwanie używam:

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

Dzięki!

+1

Jeśli jesteś właścicielem serwera API, możesz zamiast tego rozważyć naprawienie nagłówków pamięci podręcznej. Zadania URLSessionTask powinny być przestrzegane w nagłówkach, więc może coś nie jest ustawione prawidłowo. –

Odpowiedz

21

Jeśli Twój przeczytać linki z @runmad widać na schemacie, że jeśli szef pliku jest niezmieniona będzie nadal używana wersja buforowana po ustawieniu cachePolicy.

W Swift3 miałem to zrobić, aby zmusić go do pracy:

let config = URLSessionConfiguration.default 
config.requestCachePolicy = .reloadIgnoringLocalCacheData 
config.urlCache = nil 

let session = URLSession.init(configuration: config) 

Że dostał naprawdę nie buforowane wersji pliku, który mi potrzebne do obliczeń szacunkowych przepustowości.

+0

To dziwne, domyślam się, że urlCache jest domyślnie zerowy. –

+0

uderzałem się w to od 5 godzin, zapisałem dzięki –

+0

@VanDuTran z [Dokumentacja URLCache] (https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410148-urlcache): "Dla domyślnych sesji, domyślne wartość to współużytkowany obiekt pamięci podręcznej adresów URL. " Oznacza to, że jeśli nic nie określisz, po prostu użyjesz tej samej pamięci podręcznej, która była dostępna dla ciebie * udostępnionej * sesji – Honey

0

Musisz ustawić cachePolicy na NSURLRequest, tutaj jest documentation.

Here's some insight as to how caching works w ogóle.

Możesz przeczytać o konkretnych teksty stałe można użyć do określenia cachePolicyhere w szczególności:

enum 
{ 
    NSURLRequestUseProtocolCachePolicy = 0, 
    NSURLRequestReloadIgnoringLocalCacheData = 1, 
    NSURLRequestReturnCacheDataElseLoad = 2, 
    NSURLRequestReturnCacheDataDontLoad = 3, 
}; 
typedef NSUInteger NSURLRequestCachePolicy; 

na przykład, to zrobić:

NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0]; 
+0

Używam NSURLSession. –

32

Zamiast używać sharedSession, ty można również utworzyć własny NSURLSession przy użyciu NSURLSessionConfiguration, który określa domyślną zasadę pamięci podręcznej. Więc określić właściwość dla sesji:

@property (nonatomic, strong) NSURLSession *session; 

, a następnie:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 
self.session = [NSURLSession sessionWithConfiguration:configuration]; 

Następnie żąda za pomocą tej sesji będzie używać tego requestCachePolicy.

+0

To nie wydaje się działać dla mnie.Przynajmniej nie w symulatorze iOS. Próbowałem wyłączyć połączenie internetowe, ale potem zwrócono buforowaną odpowiedź. Proszę spojrzeć na mu pytanie http://stackoverflow.com/questions/30324394/prevent-nsurlsession-od-caching-responses – Sunkas

+2

Widzę, że musimy również ustawić 'URLCache' na' zero' – onmyway133

+0

Czy możemy ** albo ** zrób to, co napisałeś, lub po prostu ustaw pamięć podręczną na 'nil'? Lub możemy * musi * zawierać 'NSURLRequestReloadIgnoringLocalCacheData'? Dlaczego nie skorzystać z sesji efemerycznej? – Honey

0

byłem coraz cache zdjęcie samej zawartości .. więc muszę zrobić to

imageView.imageFromUrl(self.shareData.userResponseData["photo"] as! String) 

extension UIImageView { 

public func imageFromUrl(urlString: String) { 

    if let url = NSURL(string: urlString) { 

     let request = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 60.0) 

     NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { 

      (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
      self.image = UIImage(data: data) 

     } 
    } 
} 

}

3

Poniższy kod pracował dla mnie, połów jest ustawienie URLCache do zera.

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 
    config.URLCache = nil; 
4

Swift 3, Xcode 8

extension UIImageView { 
func donloadImage(fromUrl url: URL) { 
    let request = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 60.0) 
    URLSession.shared.dataTask(with: request) { (data, response, error) in 
     guard 
      let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200, 
      let mimeType = response?.mimeType, mimeType.hasPrefix("image"), 
      let data = data, error == nil, 
      let image = UIImage(data: data) 
      else { return } 
     DispatchQueue.main.async() {() -> Void in 
      self.image = image 
     } 
    }.resume() 
} 
Powiązane problemy