2009-08-28 5 views
20

Я замечаю, что сафари iphone кэширует контент, чтобы загрузка вашей страницы позже была намного быстрее, чем настольный браузер. Так, например, возьмите мобильную веб-страницу gmail, первая загрузка довольно медленная (5-10 секунд). Но если я закрою вкладку и снова открою страницу, это очень быстро (1 секунда).Как кешировать содержимое в UIWebView для более быстрой загрузки позже?

Однако это не то же самое, если вы загружаете контент через UIWebView в своем приложении. Мне не хватает некоторых настроек? Как я могу сделать кеш UIWebView автоматически, не переживая проблемы с сохранением содержимого?

ответ

1

На основании this discussion thread, похоже, что кеширование на уровне ОС возможно с UIWebView. Основываясь на опыте, я заметил, что Safari на моем устройстве iPhone OS не кэширует свои веб-страницы (например, нажатие кнопки «Назад» в Safari не перезагружает старую страницу из кеша).

+0

Кажется, что кеш работает только с манифестом HTML 5, который используется в автономном режиме. – jianhua

21

Ключ: 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

В документации iOS указано, что NSURLRequestReturnCacheDataElseLoad «Указывает, что существующие данные кеша должны использоваться для удовлетворения запроса независимо от его возраста или срока действия». Обычно это не то, что вы хотите, поскольку оно игнорирует заголовки политики кэша, такие как max-age и т. Д. Так что это не похоже на хороший общий ответ. По-видимому, лучшим выбором является «NSURLRequestUseProtocolCachePolicy», но это, похоже, ничего не делает. – Yetanotherjosh

-1

Я сделал несколько приложений, кэш страниц в папку Documents, а затем сравнить временные штампы кэшированных & веб-страниц перед загрузкой новой веб-страницы , Таким образом, основной поток:

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

stuffFileIntoUIView 

maybeReduceCache 

Вы все еще должны ударить в Интернете, чтобы получить заголовки, но это, как правило, гораздо быстрее, чем загружать целую страницу/изображение/файл.

+6

У вас есть пример кода? – 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]; 

Это загрузит URL, в первый раз, то ищет только для изменения содержимого .., если нет изменений в URL контента будет загружаться из кэша (локальное хранилище).

+0

Не могли бы вы это немного объяснить? – Miki

+0

Сначала он загружает URL-адрес, а затем ищет только изменения содержимого. Если в содержимом URL-адреса нет обновлений, он будет загружаться из кеша (локальное хранилище). –

+0

Да, но сделайте это в ответ – Miki

Смежные вопросы