UIWebView中的异步HTTP请求是否真的产生新线程?

时间:2012-12-21 06:35:25

标签: iphone objective-c ios multithreading uiwebview

我正在研究一个涉及在UIWebView中异步加载内容的混合项目。

我们正考虑在哪里下载内容。

一个选项是在UIWebView中进行异步加载:

$.ajax({
        url: "http://hostname.com/login",
        type: 'POST',
        dataType: 'text',
        data: login_info,
        success: function (data) {
        },
        error: function (xhr) {}
})

第二个选项是通过Javascript桥接器在本机代码中:

$.ajax({
        url: "myprotocol://login",
        type: 'POST',
        dataType: 'text',
        data: login_info,
        success: function (data) {
        },
        error: function (xhr) {}
})
抓住它:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest: (NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType 
{
if([self containsCustomProtocol:request]) {
    //do native call
    return NO;
}

然后在主线程上返回时调用它:

[this.webView stringByEvaluatingJavaScriptFromString:@"methodName()"];

什么是最好的?首先没有产生线程,第二种方法没有,或者无关紧要?

1 个答案:

答案 0 :(得分:3)

IIRC所有Web请求都是在特定的Web加载GCD队列上完成的。您可以通过触发几个长的durarion请求然后在调试器中暂停应用程序来轻松地测试它。然后检查你看到的线程。

如果你看一下队列模式,那么你应该只有一个这样的队列。在线程模式下,您可能会看到多个线程,因为GCD使用并重用线程以最有效的方式在GCD上执行块。

内部webview还使用NSURLLoading和NSURLProtocol类。所以应该有恕我直言,你的方法都没有可想象的优势。

如果您想要控制来自Web视图外部的流量,您可以通过注册自己的http协议处理程序(甚至是您自己的方案)或覆盖Web视图使用的NSURLCache来获得该流量。缓存是在单个线程上访问的,而NSURLProtocol可以并行处理多个操作,可能是多线程的。