против [UIWebView loadRequest:] - оптимизация возврата из iAD в представление с помощью UIWebView - PullRequest
1 голос
/ 10 апреля 2011

У меня есть представление, которое включает в себя UIWebView, а также iAD AdBannerView.

Чтобы оптимизировать взаимодействие с пользователем и снизить нагрузку на пропускную способность, я приостанавливаю сетевую активность UIWebView при загрузке «подробного представления» iAd и возобновляю его, когда пользователь возвращается из рекламы. В настоящее время я просто делаю следующее:

-(BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
{

    if (self.webView.loading) {
        [self.webView stopLoading];
        self.loadingWasInterrupted = TRUE;
    }
    return YES;
}

-(void)bannerViewActionDidFinish:(ADBannerView *)banner
{
    if (self.loadingWasInterrupted) {
        //Should use loadRequest: instead?
        [self.webView reload];
    }
}

Я пытаюсь понять, есть ли какая-то разница между вызовом reload и loadRequest: второй раз, и если да, то это более эффективно.

Я предполагаю, что перезагрузка просто избавляет вас от необходимости удерживать объект запроса и действительно делает то же самое, но я бы хотел знать наверняка. Документы и заголовок не дают никакой подсказки.

Я понимаю, что мог бы отделить сетевую активность, чтобы понять, что происходит, но был бы признателен за любую информацию от того, кто смотрел на это раньше или кто обычно понимает, отличается ли поведение перезагрузки от loadRequest вообще. Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 апреля 2011

Хорошо, довольно сложное решение, но, тем не менее, которое, я думаю, могло бы работать для вас:

Определите собственный обработчик протокола для http:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html#//apple_ref/doc/uid/10000165i

Использование NSURLProtocol в качестве подкласса.Обработчик запустит NSURLConnection и вернет данные по мере их поступления к клиенту (в этом случае это будет UIWebView, инициировавший соединение).Пусть он добавит себя в качестве наблюдателя в NSNotificationCenter для уведомления «Пауза».

Когда вы хотите отобразить iAd, вы можете отправить свое уведомление о паузе, это отменит NSURLConnection (но не NSURLProtocol, которыйбудет оставаться открытым и загружаться, и, таким образом, ваше веб-представление будет продолжать отображаться так, как если бы оно загружалось).

Затем, когда добавление будет завершено, вы можете отправить уведомление о «возобновлении» (почти то же самое), за исключением этогоВ случае, если любые активные обработчики NSURLProtocol, получающие уведомление, будут создавать новые NSURLConnections, используя заголовок Range: для возобновления с того места, на котором они остановились:

iphone sdk: приостановка NSURLConnection?

Некоторыепредостережения:

Работает только при просмотре веб-сайтов, поддерживающих заголовок резюме (в противном случае вам может потребоваться заново установить соединение и просто игнорировать данные до получения последнего байта).

Ваш NSURLRequestsдолжны быть сформированы так, чтобы у них не было тайм-аута.(если вы хотите тайм-аут, то он должен быть в NSURLProtocol, обработчики NSURLConnections).

0 голосов
/ 16 апреля 2011

Когда вы вызываете метод «loadRequest», вы называете его как

[webview loadRquest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.ururl.com"]]];

Но когда вы вызываете «reload», вы просто указываете перезагрузить любой текущий запрос.

Так что в основном в последнем случае вы спасаете себя от создания URL-адреса из строки, а затем от запроса URL-адреса, и это делает его довольно удобным для использования.

Что касается функциональности, перезагрузка сама вызывает loadRequest, поэтому в основномнет никакой разницы с точки зрения эффективности и даже скорости.

Однако, в основном для вашего случая и во многих моих случаях, то, что мы хотим, но Apple не дала нам, выглядит примерно так: -

[webview pauseLoading];
[webview resumeLoading];

Итак, чтобы подвести итог всего этого, используйте любой из них, но если вам лень, как мне, чтобы снова указать urlrequest, просто используйте «reload»

Извинения

Извините, ребята, я привык думать, что перезагрузка должна вызывать loadRequest, но когда я попробовал метод NWCoder, он не вызывает loadRequest при вызове перезагрузки.Но я все еще думаю, что перезагрузка и loadRquest следуют тому же методу для загрузки страницы

0 голосов
/ 12 апреля 2011

Я предполагаю здесь, но я верю, что перезагрузка выполняет loadRequest: внутренне. Если вы действительно намерены протестировать это, добавьте временный подкласс в UIWebView и переопределите методы reload и loadRequest только для ведения журнала.

- (void)reload
{
    NSLog(@"reload called");
    [super reload];
}

- (void)loadRequest:(NSURLRequest *)request
{
    NSLog(@"loadRequest called");
    [super loadRequest:request];
}
...