Загрузка ресурсов

Ваше приложение может также контролировать динамику загрузки содержания — т.е. прогресс загрузки отдельных ресурсов на странице. Ресурс является любыми данными на странице, загружающейся отдельно, такие как изображения, сценарии, таблицы стилей и веб-страницы, содержавшиеся в кадрах. Веб-страница может включать многократные ресурсы, каждый имеющий их собственный запрос и ответные сообщения. Как только страницу требуют, каждый ресурс для той страницы может поступить независимо и в любой порядок. Некоторые могут загрузиться успешно, и другие не могут. Если Вы хотите быть уведомленными относительно прогресса, успешности или неуспешности загружающихся ресурсов, необходимо реализовать делегата загрузки ресурса к объекту веб-представления.

Последовательность делегата загрузки ресурса сообщения

Поскольку ресурс проходит через процесс загрузки, WebKit отправляет ряд сообщений делегату загрузки ресурса. Если ошибка произошла во время загрузки, точная последовательность зависит от ресурса и. Так как Ссылка на протокол WebResourceLoadDelegate является неофициальным протоколом, который сообщение не отправляется делегату, если это не реагирует на него. Например, последовательность сообщений для ресурса, загружающегося успешно, могла бы быть:

  1. webView:identifierForInitialRequest:fromDataSource: — вызванный перед другими методами делегата возвратить определенный с помощью приложения идентификатор ресурса.

  2. webView:resource:willSendRequest:redirectResponse:fromDataSource: — вызванный или больше раз перед запросом для загрузки ресурса отправляется.

  3. webView:resource:didReceiveResponse:fromDataSource:— вызванный один раз, когда поступает первый байт данных.

  4. webView:resource:didReceiveContentLength:fromDataSource:— вызванный нуль или многократно на ресурс до всех данных для того ресурса загружается.

  5. webView:resource:didFinishLoadingFromDataSource: — вызванный, когда поступили все данные для ресурса.

Если загрузка ресурса перестала работать, то webView:resource:didFailLoadingWithError:fromDataSource: вызывается вместо webView:resource:didFinishLoadingFromDataSource:. Другие сообщения на перенаправления могут поступить, также. Посмотрите Ссылку на протокол WebResourceLoadDelegate для полного списка методов делегата.

Идентификация ресурсов

Поскольку делегаты загрузки ресурса, возможно, должны были бы различить различные ресурсы на странице, идентификатор ресурса передается как один из параметров сообщений делегатам. Даже если запрос изменяется, идентификатор остается тем же для каждой загрузки. Например, запрос может измениться, если заголовки добавляются, URL канонический, или URL перенаправляется.

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

- (id)webView:(WebView *)sender
identifierForInitialRequest:(NSURLRequest *)request fromDataSource:(WebDataSource *)dataSource
{
    // Return some object that can be used to identify this resource
    return [NSNumber numberWithInt:resourceCount++];
}

Отслеживание прогресса загрузки ресурса

Одна причина реализации делегата загрузки ресурса состоит в том, чтобы отследить прогресс отдельных загрузок ресурса. Например, можно отслеживать число ресурсов успешно и неуспешно загруженный на страницу путем реализации следующих методов делегата. В этом примере состояние ресурса выведено на экран, как “Загружено X из ресурсов Y, Z ошибки ресурса”. Каждый метод делегата ниже постепенно увеличивает эти X, Y и значения Z. Выполните эти шаги для отображения сообщений о состоянии загрузки ресурса:

  1. Добавьте эти переменные экземпляра к своему классу делегата:

     int resourceCount;
     int resourceFailedCount;
     int resourceCompletedCount;
  2. Реализуйте webView:resource:willSendRequest:redirectResponse:fromDataSource: метод для обновления дисплея, когда WebKit начинает загружать ресурс. Обратите внимание на то, что этот метод также позволяет Вам возвращать измененный запрос. Обычно Вы не должны изменять его.

    -(NSURLRequest *)webView:(WebView *)sender
    resource:(id)identifier
    willSendRequest:(NSURLRequest *)request
    redirectResponse:(NSURLResponse *)redirectResponse
    fromDataSource:(WebDataSource *)dataSource
    {
        // Update the status message
        [self updateResourceStatus];
        return request;
    }
  3. Реализуйте updateResourceStatus метод, вызванный в примере кода выше, для использования resourceCount переменная экземпляра для обновления дисплея. Вы постепенно увеличиваетесь resourceCount переменная экземпляра в webView:identifierForInitialRequest:fromDataSource: метод как показано в Идентификации Ресурсов.

  4. Реализуйте webView:resource:didFailLoadingWithError:fromDataSource: метод, чтобы постепенно увеличить число неработающего ресурса загружается и обновить дисплей как в:

    -(void)webView:(WebView *)sender resource:(id)identifier
    didFailLoadingWithError:(NSError *)error
    fromDataSource:(WebDataSource *)dataSource
    {
        resourceFailedCount++;
        // Update the status message
        [self updateResourceStatus];
    }
  5. Реализуйте webView:resource:didFinishLoadingFromDataSource: метод, чтобы постепенно увеличить число успешных загрузок ресурса и обновить дисплей как в:

    -(void)webView:(WebView *)sender
    resource:(id)identifier
    didFinishLoadingFromDataSource:(WebDataSource *)dataSource
    {
        resourceCompletedCount++;
        // Update the status message
        [self updateResourceStatus];
    }
  6. Реализуйте updateResourceStatus метод для обновления дисплея.

  7. Кроме того, реализуйте загрузку кадра webView:didStartProvisionalLoadForFrame: метод делегата сбросить эти переменные к 0 когда запускается новая загрузка страницы.

  8. Сборка и запущенный Ваше приложение.

При запуске приложения, необходимо видеть, что сообщение о ходе выполнения показывает общее количество ресурсов на страницу, и прогрессивно сколько ресурсов загружается успешно и неуспешно.