ios - dispatch_async 和异步请求的问题

标签 ios multithreading asynchronous grand-central-dispatch

那么第一个问题就是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/

相关文章:

ios - CoreData多线程_违规调试

c++ - 释放在不同同步上下文中使用的类成员

java - 在 Spring Boot 中实现简单的异步方法调用时遇到问题

javascript - 等待请求完成并返回数据

ios - 为什么对 navigationController 进行覆盖 :willShowViewController:animated necessary for tab bars

ios - Swift - 如果文本与数组中的任何字符串完全匹配

html - 基本 HTML - 应用 div id

ios - 禁用 iOS 键盘中的空格键

java - Android 中的线程未按预期工作

javascript - javascript对象逐行执行