2012-01-27 29 views
9

Dường như UIWebView không phải lúc nào cũng gọi storeCachedResponse:forRequest: bất cứ khi nào tải tài nguyên. Có ai biết tại sao không? Tôi đang cố gắng lưu trữ hình ảnh bằng cách sử dụng -[NSURLCache storeCachedResponse:forRequest:], nó hoạt động tốt nhất, tuy nhiên trong một số trường hợp, UIWebView không gọi phương thức này khi tải trang nơi thực sự có hình ảnh trên đó.UIWebView không phải lúc nào cũng gọi - [NSURLCache storeCachedResponse: forRequest:]

+0

Tôi nhận thấy điều này quá; mặc dù chỉ * trên * thiết bị cho ứng dụng của tôi. Khi chế độ xem web tải yêu cầu từ NSURLCache, có vẻ như nó bỏ qua bộ nhớ cache rất giống nhau đó cho nội dung trên trang đó. – Nevir

Trả lời

4

Như được mô tả hereNSURLConnection không gọi storeCachedResponse:forRequest: nếu kích thước tệp vượt quá 50kb (52428 byte).
Hãy thử ASIHTTPRequestcaching.

+0

Tôi cũng thấy điều này cho các tệp nhỏ (100s byte). Chế độ xem web cũng không gọi là 'cachedResponseForRequest:' – Nevir

+0

@Nevir Vui lòng xem [câu trả lời của tôi] (http://stackoverflow.com/a/9968398/517815). :) – MrGomez

2

Bạn đã kiểm tra trạng thái HTTP và tiêu đề bộ nhớ cache chưa? Hết hạn, Kiểm soát bộ nhớ cache, v.v ...? Có thể một máy chủ trả lời với trạng thái = 304 mà không có bất kỳ thân phản hồi nào?

- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)aResponse 
{ 
    NSLog(@"CODE: %d", ((NSHTTPURLResponse *)aResponse).statusCode); 
    NSLog(@"HEADERS: %@", ((NSHTTPURLResponse *)aResponse).allHeaderFields); 
} 
10

trả lời truy vấn của nhà cung cấp tiền thưởng của:

Tôi thấy điều này cho các tập tin nhỏ (100 byte) là tốt. Các webview cũng thất bại trong việc gọi cachedResponseForRequest:

tôi thấy this question nhằm giải quyết hành vi này trực tiếp:

Mặc dù tài liệu của Apple indicating otherwise, NSURLCache trên iOS không làm bất cứ đĩa (flash) bộ nhớ đệm ở tất cả . Bạn có thể phân lớp NSURLCache để thay đổi hành vi của các lấy và cửa hàng hoạt động để sử dụng đĩa (như SDURLCache làm), nhưng do sau hạn chế nghiêm trọng về cách thức bộ nhớ cache được sử dụng và thực hiện, này không làm việc cũng như bạn mong muốn:

  • NSURLConnection thậm chí không gọi storeCachedResponse:forRequest: cho các tập tin trên về 50KB (> = 52.428 byte, để được chính xác). Điều này làm cho việc phân lớp là NSURLCache vô nghĩa đối với việc sử dụng chúng tôi (hình ảnh 200KB), bởi vì nó thậm chí sẽ không truy cập được vào bộ nhớ cache. Kết quả là , chúng tôi phải thêm bộ nhớ đệm theo cách thủ công ở cấp độ trên NSURLConnection.

  • Ngay cả khi một cuộc gọi được tích hợp theo cách thủ công của NSURLCache storeCachedResponse:forRequest:, nó chỉ lưu trữ phản hồi trong bộ nhớ nếu nó nhỏ hơn khoảng 180KB. Tôi đã thử nghiệm điều này bằng cửa hàng gọi điện theo cách thủ côngCachedResponse theo cách thủ công và thấy rằng trước/sau currentMemoryUsage không thay đổi cho độ dài dữ liệu trên khoảng 180KB. Vì vậy, chúng tôi cũng phải ghi bộ nhớ đệm LRU của riêng mình.

(tôi nhấn mạnh).

Điều này dường như chịu trách nhiệm về hành vi được gọi ra. Là the current accepted answer points out, ASIHTTPRequest là cách giải quyết dự kiến ​​cho hành vi này.

Tuy nhiên, lưu ý caveat ở phía trên cùng của trang:

Xin lưu ý rằng tôi không còn làm việc trên thư viện này - bạn có thể muốn xem xét sử dụng một cái gì đó khác cho các dự án mới. :)

Bạn nên xem xét dựa vào các thư viện được hỗ trợ hoặc nếu thích, hãy đóng góp lại thư viện này khi thư viện này tuân theo mã của bạn.

+1

Đánh giá cao nó :) (Và một ví dụ tuyệt vời về nơi tôi nên tìm kiếm khó hơn) - cảm ơn vì đã dành thời gian để đào sâu vào điều này! – Nevir

+0

@Nevir Không sao cả! Tôi rất vui vì nó hữu ích. :) – MrGomez

+0

Có ai biết nếu điều này vẫn là trường hợp với NSURLSession trên iOS 7/8? Tôi đang gặp sự cố khi tải NSURLCache để lưu các tệp hình ảnh lớn (~ 7MB). –

2

Tôi không chắc chắn cách thức hoạt động của UIWebvieuw, nhưng khi bạn sử dụng NSURLRequest, kích thước tối đa của tệp phụ thuộc vào cách bạn khởi tạo URLCache (initWithMemoryCapacity: (NSUInteger) memoryCapacity ...) Tôi vừa lưu vào bộ nhớ cache một file 2MB

+0

Đối với tôi, tệp .css 515KB được yêu cầu từ UIWebView có thể được xử lý bằng 'cachedResponseForRequest:' của một lớp con 'NSURLCache' được khởi tạo với' memoryCapacity: 0 diskCapacity: 1024 * 1024 * 256' – hiroshi

3

NSURLCache làm việc với hai cache khác nhau: trên đĩa bộ nhớ cache và trong bộ nhớ Cache

  • phản hồi sẽ được lưu trữ để bộ nhớ cache trong bộ nhớ nếu kích thước phản ứng là dưới 50kb và
  • phản hồi sẽ được lưu trữ để bộ nhớ cache trên đĩa nếu kích thước phản ứng là qua 50kb

Nếu bạn khởi NSURLCache với diskPath nil sau đó bộ nhớ cache trên đĩa sẽ không hoạt động và storeCachedResponse:forRequest: sẽ chỉ được kêu gọi kích thước phản hồi dưới 50kb.

Vì vậy, cấu hình URLCache bạn như thế này

[[MYCustomURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 
          diskCapacity:20 * 1024 * 1024 
          diskPath:@"urlcache.db"]; 
Các vấn đề liên quan