2009-08-28 12 views
20

Zauważyłem, że iPhone Safari buforuje zawartość, dzięki czemu ładowanie strony na później jest znacznie szybsze, podobnie jak przeglądarka na komputerze. Weźmy na przykład stronę mobilną gmail, pierwsze ładowanie jest dość powolne (5-10 sekund). Ale jeśli zamknę kartę i ponownie otworzę stronę, jest to bardzo szybkie (1 sekunda).Jak cacheować zawartość w UIWebView, aby przyspieszyć późniejsze ładowanie?

Jednak to zachowanie nie jest takie samo, jeśli załadujesz zawartość za pomocą interfejsu UIWebView w aplikacji. Czy brakuje niektórych ustawień? Jak sprawić, aby UIWebView buforował zawartość automatycznie, bez konieczności samodzielnego zapisywania zawartości?

Odpowiedz

1

Na podstawie this discussion thread wydaje się, że nie jest możliwe buforowanie na poziomie OS z UIWebView. Na podstawie doświadczenia zauważyłem, że Safari na moim urządzeniu iPhone OS nie buforuje stron internetowych (np. Naciśnięcie przycisku wstecz w przeglądarce Safari nie powoduje przeładowania starej strony z pamięci podręcznej).

+0

Wydaje się, że pamięć podręczna działa tylko w manifestie HTML 5, który jest używany w trybie offline. – jianhua

21

Kluczem jest: 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

Dokumentacja systemu iOS mówi, że NSURLRequestReturnCacheDataElseLoad "Określa, że ​​istniejące dane pamięci podręcznej powinny być używane do spełnienia żądania, niezależnie od jego wieku lub daty wygaśnięcia." Zasadniczo nie jest to tym, czego potrzebujesz, ponieważ ignoruje nagłówki zasad dotyczących pamięci podręcznej, takie jak maksymalny wiek i tak dalej. To nie brzmi jak dobra ogólna odpowiedź. Pozornie najlepszym wyborem jest "NSURLRequestUseProtocolCachePolicy", ale wydaje się to nic nie robić. – Yetanotherjosh

-1

Zrobiłem kilka aplikacji, które strony cache do folderu Dokumenty, a następnie porównać czas-znaczków buforowanych & stron przed załadowaniem nowej strony internetowej . Tak więc podstawowy przepływ jest:

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

stuffFileIntoUIView 

maybeReduceCache 

Masz jeszcze trafić na Internecie, aby nagłówki, ale to zwykle znacznie szybciej niż pobieranie całą stronę/obraz/plik.

+6

Czy masz przykładowy kod tego? – 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]; 

Będzie załadować url raz pierwszy wtedy szuka jedynie zmiany treści .., jeśli nie ma aktualizacje w zawartości URL będzie to obciążenie z cache (pamięć lokalna).

+0

Czy możesz to trochę wyjaśnić? – Miki

+0

Załaduje adres URL po raz pierwszy, a następnie szuka tylko zmian zawartości .., jeśli nie ma żadnych aktualizacji w zawartości URL, załaduje się z pamięci podręcznej (pamięć lokalna). –

+0

Tak, ale zrób to w odpowiedzi – Miki

Powiązane problemy