gpt4 book ai didi

ios - dispatch_async 和异步请求的问题

转载 作者:可可西里 更新时间:2023-11-01 04:11:39 27 4
gpt4 key购买 nike

那么第一个问题就是dispatch_async是如何决定使用哪个线程的呢?只是随机选择它?我需要做一些解析和核心数据的事情,所以我不想阻塞 UI 线程并使用 dispatch_async,但在那之后我发送一个 NSURLRequest 来获取更多数据和回调永远不会被调用(可能是因为线程已经死了)。

那么制作它的好方法是什么?而且我不能使用

sendAsynchronousRequest:queue:completionHandler: 

因为部署操作系统是4.现在我只是在里面发送请求

dispatch_async(dispatch_get_main_queue(), ^{
});

dispatch_async(myQueue) block 内,它执行所有解析并保存到核心数据。但这对我来说似乎不对,我的意思是应该有一种方法可以使用 dispatch_async 并告诉它不要停止运行,对吗?因为使用同步请求不是一种选择。

最佳答案

So the first question is how does dispatch_async determines which thread to use?

在使用 GCD 时,您不应该考虑线程。这一切都在幕后为您处理。您在 queues 中思考,这是您传递给 dispatch_async 的内容以及要执行的 block 。 GCD 队列确实有点映射到线程,但您无需担心幕后发生的事情 - GCD 会为您处理所有这些。

至于您的代码,我认为它与此类似:

dispatch_async(myQueue, ^{
// Do some stuff off the main queue

dispatch_async(dispatch_get_main_queue(), ^{
// Do something with the UI
});
});

这完全没有错误。您不必担心发送到 myQueue 的 block 所在的线程可能会终止。队列将一直存在,直到 block 完成运行。您在原始调度中调度到主队列这一事实很好 - 主队列上的工作将愉快地完美运行。

我认为您也在问为什么在异步调度中使用 NSURLRequest 时您会看到它从未调用回调。那是因为它与当前运行循环紧密耦合,如果您当前在后台线程(您的 myQueue 将在其上运行),那么该运行循环将不会再次运行,直到另一个 block 被放入队列。所以你的回调永远不会运行。

我鼓励您去阅读更多关于 GCD 的内容以及异步与同步的实际含义,因为我觉得您可能还没有完全理解它。我回答了一个类似的问题 here .

关于ios - dispatch_async 和异步请求的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9886607/

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