我正在研究一个涉及在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()"];
什么是最好的?首先没有产生线程,第二种方法没有,或者无关紧要?
答案 0 :(得分:3)
IIRC所有Web请求都是在特定的Web加载GCD队列上完成的。您可以通过触发几个长的durarion请求然后在调试器中暂停应用程序来轻松地测试它。然后检查你看到的线程。
如果你看一下队列模式,那么你应该只有一个这样的队列。在线程模式下,您可能会看到多个线程,因为GCD使用并重用线程以最有效的方式在GCD上执行块。
内部webview还使用NSURLLoading和NSURLProtocol类。所以应该有恕我直言,你的方法都没有可想象的优势。
如果您想要控制来自Web视图外部的流量,您可以通过注册自己的http协议处理程序(甚至是您自己的方案)或覆盖Web视图使用的NSURLCache来获得该流量。缓存是在单个线程上访问的,而NSURLProtocol可以并行处理多个操作,可能是多线程的。