全局队列和用户队列之间有什么区别?

时间:2012-12-16 06:51:17

标签: ios grand-central-dispatch

  

可能重复:
  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(), ^{

        });
    });

有什么区别?如果我想从网上下载很多图片,哪个更好?

2 个答案:

答案 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);,您将获得一个串行队列和先进先出行为。

如果您不担心线程安全或作业返回的顺序,请使用第一种方法。