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:]
Trả lời
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.
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);
}
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ớpNSURLCache
để 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ọistoreCachedResponse: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ênNSURLConnection
.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/saucurrentMemoryUsage
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.
Đá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
@Nevir Không sao cả! Tôi rất vui vì nó hữu ích. :) – MrGomez
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). –
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
Đố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
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"];
- 1. setNeedsDisplay không phải lúc nào cũng gọi drawRect
- 2. MKMapView regionDidChangeAnimated không phải lúc nào cũng được gọi!
- 3. NSURLCache không lưu vào bộ nhớ đệm
- 4. UITableViewCell không phải lúc nào cũng có thể chọn?
- 5. NavigationBar setShadowImage không phải lúc nào cũng hoạt động
- 6. Bash eval replace $() không phải lúc nào cũng tương đương?
- 7. FLAG_TURN_SCREEN_ON không phải lúc nào cũng hoạt động
- 8. OnFocusChange không phải lúc nào cũng hoạt động
- 9. NSManagedObjectContextObjectsDidChangeNotification không phải lúc nào cũng được gọi ngay lập tức
- 10. Tại sao không phải lúc nào cũng sử dụng bài đăng HTTP cho cuộc gọi ajax?
- 11. ViewPager không phải lúc nào cũng làm mới khi setAdapter được gọi, FragmentStatePagerAdapter
- 12. onKeyDown không phải lúc nào cũng được gọi trong ứng dụng Android
- 13. Khởi tạo đơn vị Delphi không phải lúc nào cũng được gọi là
- 14. Tại sao không phải lúc nào cũng sử dụng psyco cho mã Python?
- 15. iOS: Ảnh tải lên Facebook không phải lúc nào cũng tải lên
- 16. Truy vấn phiên bản Internet Explorer từ dòng lệnh không phải lúc nào cũng hoạt động?
- 17. C# lập trình tạo lối tắt tới thư mục không phải lúc nào cũng hoạt động
- 18. Tại sao không phải lúc nào cũng sử dụng enctype = "multipart/form-data"?
- 19. Tại sao SharpSVN SvnClient.Export (...) không phải lúc nào cũng tìm các tệp cần có?
- 20. Eclipse nghịch đảo của F3 - Alt-Left không phải lúc nào cũng hoạt động
- 21. Làm mới F5 không phải lúc nào cũng có sẵn/làm việc trong nhật thực
- 22. AccessibilityLabel and accessibilityHint properties không phải lúc nào cũng được tải từ NIB
- 23. VS2010 Không phải lúc nào cũng xây dựng trước khi gỡ lỗi
- 24. Tại sao nhiệm vụ không phải lúc nào cũng hoạt động trong các biểu thức Góc?
- 25. Hoạt ảnh khung UIView, chế độ xem phụ UIScrollView không phải lúc nào cũng hoạt ảnh
- 26. Tắt Django CSRF cho các chế độ xem không phải lúc nào cũng có phản hồi
- 27. Gửi email bằng email có đính kèm không phải lúc nào cũng hoạt động
- 28. CodeSense không phải lúc nào cũng hoạt động khi nhập Khung
- 29. Có lý do chính đáng nào để chúng tôi không phải lúc nào cũng sử dụng Google API SDK không?
- 30. Lý do "tải lại!" không phải lúc nào cũng hoạt động trong giao diện điều khiển Rails?
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