Ios 有没有可能;暂停“;一个线程,然后让另一个操作先进行?

Ios 有没有可能;暂停“;一个线程,然后让另一个操作先进行?,ios,objective-c,multithreading,Ios,Objective C,Multithreading,我设置了2个UIWebView,第一个是控制第二个。他们通过ajax请求进行通信 我想在第二个WebView中加载一个网站,然后继续执行其他任务。不幸的是,这是崩溃。它正在崩溃,因为Web线程在收到响应后立即被第一个线程占用。第二个没有时间加载网页,导致死锁 我想延迟响应,直到第二个WebView完全加载网页。当前,第二个WebView在第一个WebView获得响应后立即开始加载(这是Web线程被释放的时候) 是否可以“暂停”/“暂停”当前(第一个WebView)执行,直到第二个WebView完

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

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

我想延迟响应,直到第二个WebView完全加载网页。当前,第二个WebView在第一个WebView获得响应后立即开始加载(这是Web线程被释放的时候)

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

活动:

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

    解决方案: 正如你在评论中看到的那样,我通过让then同时工作解决了我的问题。基本上,我必须使用大中央调度(GCD)
    。另一种选择是使用NSOperationQueues来实现它,这使您能够更好地控制执行流程,但实现起来往往更复杂

    有用文献:


      • 你试过这样的东西吗

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

        是的,最好的两种方法是使用
        grandcentraldispatching(GCD)
        NSOperation
        NSOperationQueue


        关于这一点的解释很长,但我会指导你阅读类似的内容。如果你在谷歌上搜索这些术语,你可以找到很多其他资源。

        现在,这可能需要一些调整,但它应该给你一个好的起点

        基本上,我们创建了一个并发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];
                }
            });
        
        });
        

        谢谢你的回答!这也帮了大忙。尤其是链接。我选择了答案,因为它马上给了我一个例子