2013-04-12 35 views
2

我设置了2个UIWebViews,第一个控制第二个。他们通过Ajax请求进行通信。是否可以“暂停”一个线程并让其他操作先行?

我想在第二个WebView中加载一个网站,然后继续执行其他任务。不幸的是,这是崩溃。它正在崩溃,因为Web Thread在获得响应后正在被第一个权利占用。第二个没有时间加载网页并导致死锁。

我想延迟响应,直到第二个WebView完全加载网页。目前,第二个WebView在第一个WebView获取和响应之后开始加载(即Web线程被释放时)。

在第二个WebView加载完成之前,有可能“暂停”/“暂停”当前(第一个WebView)执行吗?这意味着也开始执行第二个WebView。

事件:

  1. 第一的WebView发送命令(使用同步AJAX命令)
  2. 网络线程阻塞通过第一的WebView的任务加载网页
  3. 响应的命令,并计算执行
  4. 返回响应
  5. 第二个WebView 开始加载网页
  6. 死锁

我希望事件5在事件4之前。这可能吗?

解决方案: 正如你在我通过使解决我的问题的意见看,然后工作同时。基本上我不得不使用Grand Central Dispatch(GCD)。另一种选择是使用NSOperationQueues来实现它,它使您可以更好地控制执行流程,但实施起来往往更加复杂。

有用文学:

回答

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]; 
     } 
    }); 

}); 
+0

感谢您的回答,我解决了我的僵局。 =) – Senad

+0

太棒了!我很高兴它为你工作:) – JonahGabriel

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"]]]; 
     } 
    } 
} 
2

是,要做到这两个最好的方式是使用两种Grand Central Dispatching (GCD)NSOperationNSOperationQueue

对此的解释相当长,但我会指导您阅读this之类的内容。如果你在谷歌搜索这些条款,你可以找到很多其他资源。

+0

谢谢你的回答!这也有很多帮助。特别是链接。我选择了ate50eggs答案,因为它立刻给了我一个例子。 :) – Senad

相关问题