是否可以“暂停”一个线程并让另一个操作先进行?

时间:2013-04-12 18:28:05

标签: ios objective-c multithreading

我设置了2个UIWebViews,第一个是控制第二个UIWebViews。他们正在通过ajax请求进行通信。

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

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

是否可以“暂停”/“暂停”当前(第一个WebView)执行,直到第二个WebView完成加载?这意味着也可以开始执行第二个WebView。 / p>

事件:

  1. 第一个WebView发送命令加载网页(使用同步AJAX命令)
  2. 第一个WebView任务阻止的Web线程
  3. 执行命令和响应计算
  4. 回复
  5. 第二个WebView 开始加载网页
  6. 死锁
  7. 我希望事件5在事件4之前。这可能吗?

    解决方案: 正如你可以在评论中看到的那样,我已经解决了我的问题,然后让他们同时工作 。基本上我不得不使用 Grand Central Dispatch(GCD)。另一种选择是使用 NSOperationQueues 来实现它,这使您可以更好地控制执行流程,但实现起来往往更复杂。

    有用的文献:

3 个答案:

答案 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)NSOperationNSOperationQueue

对此的解释很长,但我会指导你阅读类似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"]]];
        }
    }
}