Я разрабатываю приложение, которое требует кэширующихся веб-страниц (полностью) наряду с их файлами CSS и изображениями после сохранения всего HTML страницы (прохождение через ссылок, чтобы хранить каждый файл наряду с файлом HTML).
При просмотре файла HTML офлайн, UIWebView
занимает много времени для загрузки страницы, учитывая, что я уже в режиме офлайн, и файл находится на диске наряду с его CSS и изображениями.
Я использую этот код для загрузки файла:
NSData *htmlData = [NSData dataWithContentsOfFile:htmlFilePath];
[wView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL fileURLWithPath:self.htmlFolderPath isDirectory:YES]];
Есть ли любое другое средство загрузки файла к UIWebView
это может загрузить его быстрее?
P.S.: это загружается очень быстро на средстве моделирования (офлайн), но на устройстве требуется много времени (рассмотрение уже офлайновый кэшируемый файл)
Спасибо за справку.
Является ли ваше решение на самом деле кэшированием других вещей, кроме html-файла, то есть картинок, css и т.д., И перелинковкой их в html-странице? Я предполагаю, что вы загружаете и кэшируете html-страницу и внешние ресурсы, затем UIWebView загружает этот html-файл и продолжает загружать внешние ресурсы. Это объясняет быструю производительность на симуляторе и более медленную производительность на устройстве.
Вот библиотека, предназначенная для выполнения именно того, что вы пытаетесь сделать: ASIWebPageRequest.
Следует также отметить, что это может быть просто узким местом в дисковом интерфейсе. В своем проекте я загружал большие изображения в uitableview, и даже после того, как они были закэшированы, я заметил довольно большую задержку при извлечении их с диска, потому что они были очень большими.
Поскольку это, вероятно, займет время, потому что необходимо проанализировать и отобразить страницу, вы можете рассмотреть возможность запуска UIWebView в фоновом режиме; т.е. добавлен как подвид, но не виден.
Возможно, UIWebView достаточно умен, чтобы знать, что ему ничего не нужно делать, но я подозреваю, что по крайней мере анализ HTML и CSS выполняется сразу.
Если он ничего не делает, не будучи видимым, уменьшите размер до 1x1, установите непрозрачность = 0 и поместите этот пиксель в такое место, где он не может мешать обработке событий касания.
Не идеально, но может сработать.
Я могу дать вам представление об альтернативных способах загрузки HTML из файла в UIWebView. В небольшом проекте, который у меня есть, Objective-C используется в качестве чистой оболочки для UIWebView
Проект находится здесь, но основной код ниже: http://github.com/robb1e/iWeb
- (void)viewDidLoad {
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html" inDirectory:@"."]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
[super viewDidLoad];
}
I Я также изучаю способы улучшить воспринимаемую производительность, показывая изображение, пока DOM готовится. Вот некоторые ответы, которые я получил:
Я почти уверен, что вы никогда не сможете это сделать. UIWebView просто нужно некоторое время, чтобы обработать вашу веб-страницу, даже если это локальная страница.
Помня об этом, вы можете попробовать предварительно загрузить страницу перед ее отображением. Например, если вы показываете его после того, как пользователь нажимает кнопку, предварительно загрузите страницу, когда вы показываете кнопку, а не когда пользователь действительно нажимает кнопку. Пользователь не замечает медленную загрузку, потому что она обрабатывается в фоновом режиме, поэтому, когда пользователь нажимает кнопку, страница уже загружена.