与[UIWebView loadRequest:] - 优化从iAD返回到具有UIWebView的视图

时间:2011-04-10 17:02:10

标签: iphone uiwebview iad

我有一个包含UIWebView和iAD AdBannerView的视图。

优化体验并减少带宽争用 - 我在加载iAd“详细信息视图”时暂停UIWebView的网络活动,并在用户从广告返回时恢复它。目前,我只是做以下事情:

-(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 个答案:

答案 0 :(得分:2)

好吧,这是一个相当复杂的解决方案,但我认为可能对您没有影响的是:

为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,它将保持打开并加载,因此您的webview将继续显示为正在加载)。

然后,当添加完成后,您可以发送“恢复”通知(大致相同),除非在这种情况下,接收通知的任何活动NSURLProtocol处理程序将创建新的NSURLConnections,使用Range:标头恢复它们中断的位置:

iphone sdk: pausing NSURLConnection?

一些警告:

仅在浏览支持简历标题的网站时才有效(否则您可能必须重新开始连接,并且只是在收到最新字节之前忽略数据)。

您的NSURLRequests应该形成,以便它们没有超时。 (如果你想要超时,那么它应该在NSURLProtocol处理程序NSURLConnections中)。

答案 1 :(得分:0)

我猜这里,但我相信重装正在内部执行loadRequest:如果您真的想要测试它,那么您可以向UIWebView添加一个临时子类,并仅为了记录而覆盖reload和loadRequest方法。

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

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

答案 2 :(得分:0)

当您调用方法“loadRequest”时,您可以将其称为

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

但是当你调用“reload”时,你只是指示重新加载当前的请求。

所以基本上在后一种情况下,你正在节省自己从字符串创建一个url然后从url创建一个请求,这使得它非常方便使用。

根据功能的情况,重新加载本身会调用loadRequest,因此基本上在效率和速度方面没有区别。

然而,基本上对于你的情况和我的许多情况,我们想要的东西,但Apple没有给我们的东西是这样的: -

[webview pauseLoading];
[webview resumeLoading];

所以总结一下,使用它们中的任何一个,但如果你像我一样懒,再次指定urlrequest只需使用“reload”

道歉

很抱歉,我以前认为重新加载必须调用loadRequest但是当我尝试NWCoder的方法时,它不会在调用reload时调用loadRequest。但我仍然认为reload和loadRquest遵循加载页面的相同方法