我设置了2个UIWebViews,第一个是控制第二个UIWebViews。他们正在通过ajax请求进行通信。
我想在第二个WebView中加载一个网站,然后继续执行其他任务。不幸的是,这是崩溃。它崩溃是因为Web Thread在获得响应后被第一个权限占用。第二个没有时间加载网页并导致死锁。
我想延迟响应,直到第二个WebView完全加载了网页。目前,第二个WebView在第一个WebView获取和响应(即发布Web线程时)后立即开始加载。
是否可以“暂停”/“暂停”当前(第一个WebView)执行,直到第二个WebView完成加载?这意味着也可以开始执行第二个WebView。 / p>
事件:
我希望事件5在事件4之前。这可能吗?
解决方案: 正如你可以在评论中看到的那样,我已经解决了我的问题,然后让他们同时工作 。基本上我不得不使用 Grand Central Dispatch(GCD)。另一种选择是使用 NSOperationQueues 来实现它,这使您可以更好地控制执行流程,但实现起来往往更复杂。
有用的文献:
答案 0 :(得分:4)
现在,这可能需要一些调整,但它应该给你一个好的起点。
基本上,我们创建一个并发GCD队列并调度2个异步调用,以使用2个不同URL的内容加载HTML字符串。
请求完成后,他们会将html字符串加载到您的Web视图中。请注意,如果已加载第二个UIWebView,则第一个UIWebView将仅加载其数据。
__weak ViewController *bSelf = self;
dispatch_queue_t webQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(webQueue, ^{
NSError *error;
bSelf.html1 = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://google.com"] encoding:NSASCIIStringEncoding error:&error];
if( !bSelf.secondLoaded)
{
dispatch_sync(dispatch_get_main_queue(), ^{
[bSelf.webView1 loadHTMLString:bSelf.html1 baseURL:nil];
});
}
});
dispatch_async(webQueue, ^{
NSError *error;
bSelf.html2 = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://amazon.com"] encoding:NSASCIIStringEncoding error:&error];
bSelf.secondLoaded = YES;
dispatch_sync(dispatch_get_main_queue(), ^{
[bSelf.webView2 loadHTMLString:bSelf.html2 baseURL:nil];
if( bSelf.html1 != nil )
{
[bSelf.webView1 loadHTMLString:bSelf.html1 baseURL:nil];
}
});
});
答案 1 :(得分:2)
是的,执行此操作的两种最佳方法是使用Grand Central Dispatching (GCD)
或NSOperation
和NSOperationQueue
。
对此的解释很长,但我会指导你阅读类似this的内容。如果您在谷歌搜索这些条款,您可以找到许多其他资源。
答案 2 :(得分:0)
你尝试过这样的事吗?
- (void)viewDidLoad
{
[super viewDidLoad];
self.webView.delegate = self;
self.webView2.delegate = self;
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"yourURL"]]];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
if (webView == self.webView)
{
if (!self.webView.isLoading)
{
[self.webView2 loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"yourURL"]]];
}
}
}