dispatch_get_global_queue和dispatch_queue_create有什么区别?

2020/12/16 00:51 · ios ·  · 0评论

我正在编写一个中等复杂的iOS程序,它的一些较长的操作(解析,网络连接等)需要具有多个线程。但是,我对dispatch_get_global_queue之间的区别感到困惑dispatch_queue_create

我应该使用哪一个,您能否简单解释一下一般的区别?谢谢。

文档所述,全局队列适合于并发任务(即,您将异步分派各种任务,并且如果它们并发运行,您会感到非常满意),并且您不想遇到创建和创建任务的理论开销。破坏自己的队列。

如果您需要一个串行队列(即,您需要一次执行一个分派的块),那么创建自己的队列非常有用。这在许多情况下很有用,例如当每个任务都依赖于前一个任务或协调与来自多个线程的某些共享资源的交互时。

较不常见,但是如果您需要将屏障与并发队列结合使用,那么您还需要创建自己的队列。在那种情况下,创建并发队列(即dispatch_queue_create带有DISPATCH_QUEUE_CONCURRENT选项),然后将障碍与该队列结合使用。您永远不要在全局队列上使用障碍。

我的总顾问是,如果您需要一个串行队列(或需要使用屏障),则创建一个队列。如果不这样做,请继续使用全局队列,并绕开创建自己的队列的开销。


如果需要并发队列,但想控制可以同时运行多少个操作,则还可以考虑使用NSOperationQueue具有maxConcurrentOperationCount属性的队列这在执行网络操作时非常有用,并且您不希望将太多并发请求提交到服务器。

刚刚发布了一个不同的答案,但这是我很久以前写的东西:

队列概念化的最佳方法是首先意识到,在非常低的级别上,只有两种类型的队列:串行队列和并发队列。

串行队列是一夫一妻制,但未提交。如果您给每个串行队列分配一堆任务,它将一次运行一个任务,一次仅使用一个线程。未提交的方面是串行队列可以任务之间切换到不同的线程串行队列始终等待任务完成,然后再转到下一个任务。因此,任务以FIFO顺序完成。您可以使用进行任意数量的串行队列dispatch_queue_create

主队列是一个特殊的串行队列。与其他未提交的串行队列不同的是,它们正在“约会”许多线程,但一次只有一个,而主队列则“嫁接到”了主线程,并且所有任务都在其上执行。主队列上的作业需要与runloop配合良好,以便较小的操作不会阻塞UI和其他重要位。像所有串行队列一样,任务以FIFO顺序完成。

如果串行队列是一夫一妻制,则并发队列是混杂的。他们将根据系统负载将任务提交到任何可用线程,甚至创建新线程。他们可以在不同的线程上同时执行多个任务。重要的是,提交给全局队列的任务必须是线程安全的,并且应尽量减少副作用。任务按FIFO顺序提交执行,但不能保证完成顺序。在撰写本文时,只有三个并发队列,您不能创建它们,只能使用来获取它们dispatch_get_global_queue

编辑:有关此答案的博客文章:http : //amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html

一个返回现有的全局队列,另一个创建一个新的全局队列。我会考虑使用NSOperation和操作队列,而不是使用GCD。您可以在本指南中找到有关它的更多信息通常,要让这些操作同时执行,您需要创建自己的队列并将其放入其中。

本文地址:http://ios.askforanswer.com/dispatch_get_global_queuehedispatch_queue_createyoushenmequbie.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!