2012-01-01 31 views
5

Trong ứng dụng của tôi, tôi đang tải dữ liệu JSON sử dụng phương pháp NSURLConnection, những gì trông giống như thế này:NSURLConnection đang trở lại dữ liệu cũ

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

tôi nhận được và lưu dữ liệu trong phương pháp -didReceiveData:, nhưng nếu tôi cập nhật của tôi Tệp JSON trên máy chủ của tôi, số NSURLConnection vẫn gửi cho tôi JSON cũ, trong khi tệp được tải lên chính xác đến máy chủ. Chỉ khi tôi xóa toàn bộ ứng dụng từ iPhone của tôi (hoặc iPhone Simulator) và xây dựng lại ứng dụng, nó sẽ nhận được tệp Json mới.

Có ai biết giải pháp cho vấn đề này không?

+0

Âm thanh như kết quả đang được lưu trong bộ nhớ cache, hãy xem [câu trả lời này] (http://stackoverflow.com/questions/405151/is-it-possible-to-prevent-an-nsurlrequest-from-caching-data-or-remove-cached -dat) – Douglas

+0

Cảm ơn bạn! Câu trả lời của bạn và Jesse đã làm việc cho tôi! – Jelle

Trả lời

9

Bạn cần phải thông báo cho NSURLRequest để đánh giá lại (nếu máy chủ của bạn gửi tiêu đề được sửa đổi thích hợp) hoặc không sử dụng bộ nhớ cache của nó. Dưới đây là một đoạn trích từ dự án JBAsyncImageView của tôi (gợi ý: Sử dụng NSURLRequestReloadRevalidatingCacheData hoặc 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

Cảm ơn bạn rất nhiều vì câu trả lời của bạn! Đã làm cho tôi! – Jelle

+0

Tôi gặp sự cố này khi iOS 7 được triển khai. Giải pháp trên KHÔNG khắc phục được sự cố của tôi. Sau khi thử một vài thứ khác nhau, tôi đã phải sử dụng giải pháp bên dưới (thêm dấu thời gian để yêu cầu). –

+0

tài liệu nói rằng "NSURLRequestReloadIgnoringLocalCacheData" không được triển khai? –

5

Giải pháp đơn giản nhất để ngăn chặn yêu cầu bộ nhớ đệm là để thêm một tham số dấu thời gian với thời gian hiện tại ở cuối:

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

Trên thực tế, có thể dễ dàng hơn khi chỉ nói 'NSURLRequest' để đánh giá lại hoặc không lưu trữ dữ liệu --- thay vì hack yêu cầu HTTP. Đối với các yêu cầu AJAX, đây sẽ là cách dễ nhất. Trên iOS, tuy nhiên, không quá nhiều. –

+1

@JesseBunch Phương pháp dấu thời gian có lợi thế trong trường hợp cấu hình bộ nhớ cache phía máy chủ hoặc proxy được cấu hình kém. – iHunter

+0

Đúng, nhưng nếu bạn bảo nó không sử dụng bộ nhớ đệm, bạn không phải lo lắng về nó. Và đối với những gì nó có giá trị, tôi đã không downvote bạn. –

Các vấn đề liên quan