gpt4 book ai didi

ios - 是否可以 "pause"线程并让另一个操作先进行?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:18:10 28 4
gpt4 key购买 nike

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

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

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

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

事件:

  1. 首先WebView发送命令加载网页(使用同步AJAX命令)
  2. Web 线程被第一个 WebView 的任务阻塞
  3. 执行命令和计算响应
  4. 返回响应
  5. 第二个 WebView 开始加载网页
  6. 僵局

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

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

有用的文献:

最佳答案

现在,这可能需要进行一些调整,但它应该为您提供了一个良好的起点。

基本上,我们创建一个并发 GCD 队列并分派(dispatch) 2 个异步调用以加载包含 2 个不同 URL 内容的 HTML 字符串。

当请求完成时,它们会将它们的 html 字符串加载到您的 Web View 中。请注意,如果第二个 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];
}
});

});

关于ios - 是否可以 "pause"线程并让另一个操作先进行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15978393/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com