【问题标题】:UIWebView webViewDidStartLoad is called with request which properties are nullUIWebView webViewDidStartLoad 被请求调用,其属性为空
【发布时间】:2011-05-11 15:48:09
【问题描述】:

我目前正在调试 UIWebView 以获取一些信息以提高性能(在服务器和 iPhone 上)。 我注意到在调用 loadRequest: 回调之后

- (void)webViewDidStartLoad:(UIWebView *)webView_ 

被调用,但是请求的每个参数都是空的。

我正在使用以下语句:

    - (void)webViewDidStartLoad:(UIWebView *)webView_{
    NSLog(@"%@ \t Start Request: %@ \n absolute: %@ \n Method: %@ \n Parameters: %@ \n Port: %@ \n Query: %@ \n Header Fields: %@ \n HTTPBody: %@ \n HTTPBodyStream: %@", [NSDate date], [[webView_ request] mainDocumentURL], [[[webView_ request] mainDocumentURL] absoluteString], [[webView_ request] HTTPMethod], [[[webView_ request] mainDocumentURL] parameterString], [[[webView_ request] mainDocumentURL] port], [[[webView_ request] mainDocumentURL] query], [[webView_ request] allHTTPHeaderFields], [[webView_ request] HTTPBody], [[webView_ request] HTTPBodyStream]);
}

输出是:

 2011-05-11 17:15:34 +0200    Start Request: (null) 
 absolute: (null) 
 Method: GET 
 Parameters: (null) 
 Port: (null) 
 Query: (null) 
 Header Fields: {
} 
 HTTPBody: (null) 
 HTTPBodyStream: (null)

对这种行为有什么解释或有什么可以解决的吗?

页面加载正常,但是加载任何内容的请求似乎需要大约 30 秒,我尽量避免。

edit:有关加载 webview 的一些附加信息。我正在调用一个将 webview 添加到 UIView 并加载 URL 的方法

    UIWebView * web = [[UIWebView alloc] initWithFrame:CGRectMake(indent, topindent+indent, screenSize.width-2*indent, screenSize.height-2*indent-topindent)];
     web.delegate = self;
    [view addSubview:web];
    NSURLRequest * someUrl = [NSURLRequest requestWithURL:[NSURL URLWithString:
@"some_URL"]];
    [web loadRequest: someUrl];

【问题讨论】:

  • 我看到了完全相同的行为,不知道该怎么做!

标签: iphone performance uiwebview


【解决方案1】:

您没有看到请求的原因是在加载请求之前未分配 webview 的 request 属性。在所有重定向之后,这可能只显示实际显示的请求。如果您想要初始请求对象,在重定向等之前,请使用 ToddH 的答案。对于最终请求,您必须在 webViewDidFinishLoad 中进行检查。

【讨论】:

    【解决方案2】:

    好吧,在遇到同样的问题后,我发现解决方案是使用这个 UIWebViewDelegate 方法:

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    

    它在 viewDidStartLoad 之前被调用,并被传递给视图将加载的请求对象。

    【讨论】:

    • 我使用该回调来跟踪正在调用哪个 URL。但是,我发现它没有提供有关加载请求的时间和订单的准确信息。
    • 使用这个函数,如果你返回YES,那么方法didStartLoading会被调用。
    【解决方案3】:

    您没有检查的一件事是请求 URL 属性。检查一下,看看你得到了什么:

    [[[webView_ request] URL] absoluteString]
    

    编辑:

    您似乎在使用自动释放对象时遇到了问题。尝试创建与 NSURLRequest 分开的 NSURL:

    NSURL *myURL = [NSURL URLWithSTring:@"some_URL"];
    NSURLRequest *someUrl = [NSURLRequest requestWithURL:myURL];
    [web loadRequest:someUrl];
    

    【讨论】:

    • true,遗憾的是没有提供任何可用信息 - 只是一个空字符串: 开始请求:(空) URL:方法:GET 参数:(空)端口:(空)查询:(空)标题字段:{}
    • 嗯,你想得到什么,什么时候调用?您如何将请求加载到 Webview 中
    • 我在初始问题中添加了关于加载请求的信息
    • 很遗憾没有改变任何东西
    • 尝试重载代理的 webview:shouldStartLoadWithRequest: 方法,看看你从那里的请求中得到了什么
    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多