Как кешировать содержимое в UIWebView для более быстрой загрузки позже?
Я замечаю, что сафари iphone кэширует контент, так что загрузка вашей страницы позже намного быстрее, чем браузер для настольных компьютеров. Так, например, возьмите мобильную веб-страницу gmail, первая загрузка довольно медленная (5-10 секунд). Но если я закрою вкладку и снова открою страницу, она будет очень быстрой (1 секунда).
Однако это поведение не то же самое, если вы загружаете контент через UIWebView в своем приложении. Мне не хватает некоторых настроек? Как сделать пользовательский интерфейс UIWebView автоматически, не переживая проблемы с сохранением содержимого?
Ответы
Ответ 1
Ключ: 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];
Ответ 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-адреса нет обновлений, он будет загружаться из кеша (локальное хранилище).
Ответ 3
На основе этот дискуссионный поток, похоже, что с UIWebView
невозможно кэширование на уровне ОС. Основываясь на опыте, я заметил, что Safari на моем устройстве iPhone OS не кэширует свои веб-страницы (например, нажатие кнопки "Назад" в Safari не перезагружает старую страницу из кеша).
Ответ 4
Я сделал несколько приложений, которые кэшируют страницы в папке "Документы", а затем сравнивает метки времени кэшированных и веб-страниц перед загрузкой новой веб-страницы. Итак, основной поток:
if (fileIsInCache)
if (cacheFileDate > webFileDate)
getCachedFile
else
getFileFromWeb
saveFileToCache
else
getFileFromWeb
saveFileToCache
stuffFileIntoUIView
maybeReduceCache
Вам все равно нужно попасть в сеть, чтобы получить заголовки, но это обычно намного быстрее, чем загрузка всей страницы/образа/файла.