2009-08-28 6 views
20

Tôi nhận thấy rằng safari iPhone lưu trữ nội dung để tải trang của bạn sau này nhanh hơn nhiều so với trình duyệt trên máy tính để bàn. Vì vậy, lấy trang web gmail di động ví dụ, tải đầu tiên là khá chậm (5-10 giây). Nhưng nếu tôi đóng tab và mở lại trang, nó rất nhanh (1 giây).Cách cache nội dung trong UIWebView để tải nhanh hơn sau này?

Tuy nhiên, hành vi này không giống nhau nếu bạn tải nội dung thông qua UIWebView trong ứng dụng của mình. Tôi có thiếu một số cài đặt không? Làm thế nào để làm cho UIWebView cache nội dung tự động mà không phải trải qua những rắc rối khi tự lưu nội dung?

Trả lời

1

Dựa trên this discussion thread nó sẽ xuất hiện ở đó không có bất kỳ bộ đệm ẩn cấp độ hệ điều hành nào có thể với UIWebView. Dựa trên kinh nghiệm tôi đã nhận thấy rằng Safari trên thiết bị iPhone OS của tôi không lưu lại các trang web của nó (ví dụ: nhấn nút quay lại trong Safari không tải lại trang cũ từ bộ nhớ cache).

+0

Dường như bộ nhớ cache chỉ hoạt động trên tệp kê khai HTML 5 được sử dụng khi ngoại tuyến. – jianhua

21

Điều quan trọng là: NSURLRequestReturnCacheDataElseLoad

NSData *urlData; 
NSString *baseURLString = @"mysite.com"; 
NSString *urlString = [baseURLString stringByAppendingPathComponent:@"myfile"]; 

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval: 10.0]; 
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:nil]; 

if (connection) 
{ 
    urlData = [NSURLConnection sendSynchronousRequest: request]; 

    NSString *htmlString = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding]; 
    [webView loadHTMLString:htmlString baseURL:baseURLString]; 
    [htmlString release]; 
} 

[connection release]; 
+9

Tài liệu iOS nói rằng NSURLRequestReturnCacheDataElseLoad "Chỉ định rằng dữ liệu bộ nhớ cache hiện có nên được sử dụng để đáp ứng yêu cầu, bất kể tuổi tác hay ngày hết hạn của nó." Đó thường không phải là những gì bạn muốn, vì nó bỏ qua các tiêu đề chính sách bộ nhớ cache như độ tuổi tối đa và vv. Vì vậy, điều này không có vẻ giống như một câu trả lời chung tốt. Lựa chọn dường như tốt nhất là "NSURLRequestUseProtocolCachePolicy" nhưng điều này dường như không làm gì cả. – Yetanotherjosh

-1

tôi đã thực hiện một vài ứng dụng mà các trang bộ nhớ cache vào thư mục Documents, sau đó so sánh thời gian tem của cache & trang web trước khi tải trang web mới . Vì vậy, luồng cơ bản là:

if (fileIsInCache) 
    if (cacheFileDate > webFileDate) 
     getCachedFile 
    else 
     getFileFromWeb 
     saveFileToCache 
else 
    getFileFromWeb 
    saveFileToCache 

stuffFileIntoUIView 

maybeReduceCache 

Bạn vẫn phải truy cập web để tải tiêu đề, nhưng thường nhanh hơn nhiều so với tải toàn bộ trang/hình ảnh/tệp.

+6

Bạn có một số mã mẫu này không? – Tudorizer

2
NSString *stringurl=[NSString stringWithFormat:@"http://www.google.com"]; 
NSURL *url=[NSURL URLWithString:stringurl]; 
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:15.0]; 
[uiwebview loadRequest:theRequest]; 

Nó sẽ tải lần đầu tiên sau đó chỉ tìm kiếm nội dung thay đổi .., nếu không có nội dung url nào sẽ tải từ bộ nhớ cache (bộ nhớ cục bộ).

+0

Bạn có thể giải thích một chút không? – Miki

+0

Nó sẽ tải một url lần đầu tiên sau đó tìm kiếm cho chỉ những thay đổi nội dung .., nếu không có bản cập nhật trong nội dung url nó sẽ tải từ bộ nhớ cache (lưu trữ cục bộ). –

+0

Vâng, nhưng làm điều này trong câu trả lời – Miki