1

我正在开发一个混合项目,该项目涉及在 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()"];

什么是最好的?第一种方法不产生线程,第二种方法是,还是没关系?

4

1 回答 1

3

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

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

在内部,webviews 也使用 NSURLLoading 和 NSURLProtocol 类。因此,恕我直言,您的任何一种方法都没有可以想象的优势。

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

于 2012-12-21T07:12:34.753 回答