2012-01-01 12 views
5

W mojej aplikacji, wczytuję dane JSON przy użyciu metody NSURLConnection, co wygląda tak:NSURLConnection wraca stare dane

NSURLRequest *request = [[NSURLRequest alloc] initWithURL: 
           [NSURL URLWithString:@"theurl"]]; 
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request 
                   delegate:self]; 
[theConnection start]; 

mogę odbierać i zapisywać dane w metodzie -didReceiveData:, ale jeśli mogę zaktualizować Plik JSON na moim serwerze, NSURLConnection nadal dostarcza mi stary JSON, podczas gdy plik jest poprawnie przesyłany na serwer. Tylko jeśli usunę całą aplikację z iPhone'a (lub iPhone'a Simulatora) i przebuduję aplikację, otrzyma nowy plik Json.

Czy ktoś zna rozwiązanie tego problemu?

+0

Dźwięki jak wynik jest buforowany, patrz [ta odpowiedź] (http://stackoverflow.com/questions/405151/is-it-possible-to-prevent-an-nsurlrequest-z-caching-data-or-remove-cached -dat) – Douglas

+0

Dziękujemy! Twoja odpowiedź Jesse'a i dla mnie zadziałała! – Jelle

Odpowiedz

9

Musisz powiedzieć NSURLRequest, aby ponownie ocenić (jeśli twój serwer wysyła odpowiednie zmodyfikowane nagłówki) lub nie używać jego pamięci podręcznej. Oto urywek z mojego JBAsyncImageView projektu (wskazówka: Użycie NSURLRequestReloadRevalidatingCacheData lub NSURLRequestReloadIgnoringLocalCacheData):

// Create request 
self.imageRequest = [[NSURLRequest alloc] initWithURL:imageURL 
              cachePolicy:(self.cachesImage) ? NSURLRequestReturnCacheDataElseLoad : NSURLRequestReloadIgnoringLocalCacheData 
             timeoutInterval:self.downloadTimeoutInterval]; 

// Begin download 
self.imageData = nil; 
self.imageConnection = [[NSURLConnection alloc] initWithRequest:self.imageRequest 
                 delegate:self 
               startImmediately:YES]; 
+1

Dziękuję bardzo za odpowiedzi! Pracował dla mnie! – Jelle

+0

Wpadłem na ten problem po wdrożeniu iOS 7. Powyższe rozwiązanie NIE naprawiło mojego problemu. Po wypróbowaniu kilku różnych rzeczy musiałem użyć poniższego rozwiązania (dodanie sygnatury czasowej do żądania). –

+0

dokumentacja mówi, że "NSURLRequestReloadIgnoringLocalCacheData" nie jest zaimplementowana? –

5

Najprostszym rozwiązaniem, aby zapobiec żądania buforowanie jest dodanie parametru datownika z bieżącym czasem na końcu:

http://example.com/api.json?my=args&timestamp=2344992923 
+1

Właściwie łatwiej jest po prostu powiedzieć 'NSURLRequest', aby ponownie ocenić lub nie buforować danych --- zamiast hakować żądanie HTTP. W przypadku żądań AJAX byłby to najprostszy sposób. W systemie iOS nie jest to jednak tak wiele. –

+1

Metoda @ JesseBunch Timestamp ma przewagę w przypadku źle skonfigurowanego buforowania po stronie serwera lub proxy. – iHunter

+0

To prawda, ale jeśli powiesz mu, żeby nie używał pamięci podręcznej, nie musisz się tym martwić. I za to, co jest warte, nie sprzeciwiłem się tobie. –