UIWebView задержка загрузки локального контента - PullRequest
6 голосов
/ 04 октября 2010

В UIWebView отображается небольшое количество локального контента, примерно 3 абзаца текста и одно изображение размером 100x100 пикселей.Когда UIWebView помещается на контроллер навигации, требуется около полсекунды, прежде чем отобразится содержимое.Это происходит на устройстве, а не в симуляторе.Очевидно, что UIWebView необходимо выполнить некоторую работу перед отображением контента, но есть ли какой-то способ, которым я могу сделать это до появления выдвинутого представления?Мне не повезло делать это сам.

Вот где я создаю и нажимаю контроллер представления, который содержит UIWebView:

ArticleViewController* viewController = [[ArticleViewController alloc] init];
viewController.article = article;
[viewController view]; //touch the view so it gets loaded
[viewController loadWebView]; //load the web view content
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];

А вот метод loadWebView:

-(void)loadWebView {
    NSString *path = [[NSBundle mainBundle] bundlePath];
    NSURL *baseURL = [NSURL fileURLWithPath:path];

    NSString* content = article.content;

    NSString *html = [NSString stringWithFormat:@"\
                      <html><body style='background-color: transparent'><style type=""text/css"">body {font-family: helvetica; color: black; font-size: 10pt; margin: 10px 10px 10px 10px}</style>\
                      %@<div style='text-align:center'><a href='13443574_9709e4cf37.jpg?photographer=test' style='-webkit-tap-highlight-color:rgba(0,0,0,0);'><img src='13443574_9709e4cf37.jpg' height='160' width='230'></a></div></body></html>", content];
    [self.webView loadHTMLString:html baseURL:baseURL];
}

Ранее у меня было [viewController loadWebView] в методе viewDidLoad, но результат, кажется, тот же.Пустой экран при нажатии viewController с последующей загрузкой контента через полсекунды.

Есть идеи?

Ответы [ 2 ]

11 голосов
/ 26 августа 2013

Проблема подтверждена

Я также вижу задержку в полсекунды или более с белым экраном перед тем, как появляется мое UIWebView содержимое.Это происходит только при первом использовании UIWebView во время этого запуска приложения.Последовательные появления UIWebView почти мгновенные.Поэтому мне и другим людям кажется, что задержка должна быть связана с необходимостью загрузки и инициализации библиотек WebKit .

Warm-up WebKit

Вы не можете устранить задержку.Но вы можете перенести эту задержку на начало вашего приложения, чтобы уменьшить раздражающий эффект «пустого экрана» для ваших пользователей.Хитрость заключается в том, чтобы загружать UIWebView с фиктивной страницей вне экрана во время запуска вашего приложения.Создайте минимальную HTML5 веб-страницу в жестко запрограммированной строке.Я использую правильный и действительный контент HTML5, чтобы минимизировать время, затрачиваемое UIWebView / WebKit на анализ.

Этот метод заметно работает на реальном оборудовании ( iPhone 3GS ), а не только на iOS Simulator .

В моем приложении делегаты didFinishLaunchingWithOptions метод , нижняя часть ARC -совместимого кода выглядит так:

…
[self.window makeKeyAndVisible];

// Performance optimization: Warm up the UIWebView widget and its related WebKit libraries.
// We are choosing the trade-off between (A) a slight delay here during app launch to create and abandon a bogus UIWebView instance, and
// (B) a flash of white and noticeable delay as the UINavigationController slides in from the right the first UIWebView we display during the app run.
UIWebView* bogusWebView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
NSString* html = @"<!doctype html><html lang=en><head><meta charset=utf-8><title>blah</title></head><body><p>bogus content</p></body></html>";
[bogusWebView loadHTMLString:html baseURL:nil]; // Load the page.
bogusWebView = nil; // Not really needed, but self-documents that we intend to discard this object.

return YES;

Эта методика, по-видимому, уменьшает большую часть, но не полностью, приблизительную задержку в полсекунды при первом появлении пользователем UIWebView на экране.Я пришел к выводу, что большая часть задержки связана с прогревом WebKit, но должны быть некоторые накладные расходы, связанные с графическим представлением UIWebView на экране.Если это так, мы не можем устранить оставшиеся накладные расходы с помощью работы вне экрана.Но, тем не менее, этот метод устраняет большинство начальной задержки.Таким образом, первое впечатление пользователя от моего приложения не будет «медленным».

1 голос
/ 04 октября 2010

Вы заставите пользователя ждать, единственный вопрос: это до или после появления веб-просмотра?Если вы настроили «до», то вам следует создать контроллер, загрузить веб-представление, но подождать, пока он не появится, пока не сработает метод -webViewDidFinishLoad: Delegate.Как только вы получите это, вы можете нажать на представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...