可能重复:
What is the difference between dispatch_get_global_queue and dispatch_queue_create?
我看到一些使用gcd的方法,但有些方法可能会这样做:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(queue, ^{
dispatch_sync(dispatch_get_main_queue(), ^{
});
});
但其他人可能会这样做:
imageQueue_ = dispatch_queue_create("com.company.app.imageQueue", NULL);
dispatch_async(imageQueue_, ^{
dispatch_async(dispatch_get_main_queue(), ^{
});
});
有什么区别?如果我想从网上下载很多图片,哪个更好?
答案 0 :(得分:20)
概念化队列的最佳方法是首先要意识到,在非常低级别,只有两种类型的队列:串行和并发。
串行队列是一夫一妻制,但未提交。如果为每个串行队列分配一堆任务,它将一次运行一个任务,一次只使用一个线程。未提交的方面是,序列号队列可能会切换到任务之间的不同线程。串行队列始终等待任务完成,然后再转到下一个任务。因此,任务以FIFO顺序完成。您可以根据需要创建任意数量的串行队列。
主队列是一个特殊的串行队列。与其他未提交的串行队列不同,因为它们“约会”许多线程但只有一个线程,主队列与主线程“结合”并且所有任务都在其上执行。主队列与主线程的runloop表现良好,因此小操作不会阻止UI和其他重要位。与所有串行队列一样,任务按FIFO顺序完成。
如果串行队列是一夫一妻制,则并发队列是混杂的。他们会将任务提交给任何可用的线程,甚至根据系统负载创建新的线程。他们可以在不同的线程上同时执行多个任务。提交到全局队列的任务是线程安全的并且最小化副作用是很重要的。任务以FIFO顺序提交执行,但不保证完成顺序。
将其恢复,所有全局队列都是并发,默认情况下所有用户队列都是串行,除非将其定义为并发。
如果您的目标是下载图像,则可能需要串行(用户)队列。下载图像更像带宽。你通常只想一次做一个(或几个)。
编辑:博客文章扩展上述答案:http://amattn.com/2013/08/28/grand_central_dispatch_gcd_summary_syntax_best_practices.html
答案 1 :(得分:3)
如果您使用dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
GCD将自动创建足够的线程来处理作业,并尽可能使用多个核心。
另一方面,如果您使用imageQueue_ = dispatch_queue_create("com.company.app.imageQueue", NULL);
,您将获得一个串行队列和先进先出行为。
如果您不担心线程安全或作业返回的顺序,请使用第一种方法。