dispatch_async和异步请求的问题

dar*_*iaa 5 multithreading asynchronous grand-central-dispatch ios

所以第一个问题是如何dispatch_async确定使用哪个线程?只是随机挑选它?我需要做一些解析和核心数据的东西,所以我不想阻止UI线程和使用dispatch_async,但之后我发送一个NSURLRequest来获取更多的数据,并且永远不会调用回调(可能因为线程已经死了) .

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

sendAsynchronousRequest:queue:completionHandler: 
Run Code Online (Sandbox Code Playgroud)

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

dispatch_async(dispatch_get_main_queue(), ^{
});
Run Code Online (Sandbox Code Playgroud)

这是内部dispatch_async(myQueue)块,它执行所有解析并保存到核心数据.但它对我来说似乎不对,我的意思是应该有一种方法来使用dispatch_async并告诉它不要杀掉它,对吧?因为使用同步请求不是一种选择.

mat*_*way 12

所以第一个问题是dispatch_async如何确定使用哪个线程?

使用GCD时,您不应该考虑线程.这些都是幕后处理的.您认为在队列中传递的是dispatch_async与要执行的块一起.GCD队列会对线程进行映射,但您无需担心幕后发生的事情--GCD会为您处理所有这些事情.

至于你假设的代码看起来与此类似:

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

    dispatch_async(dispatch_get_main_queue(), ^{ 
        // Do something with the UI
    });
});
Run Code Online (Sandbox Code Playgroud)

这完全没有错.您不必担心您发送的块myQueue运行的线程可能会被终止.队列将保持不变,直到块完成运行.您在原始调度中调度到主队列的事实很好 - 主队列上的工作将很愉快地运行.

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

我鼓励你去阅读更多关于GCD和async vs sync实际意味着什么,因为我觉得你可能还没有完全理解它.我在这里回答了类似的问题.