Ios 什么';全局队列和用户队列之间的区别是什么?

Ios 什么';全局队列和用户队列之间的区别是什么?,ios,grand-central-dispatch,Ios,Grand Central Dispatch,可能重复: 我看到一些使用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.

可能重复:

我看到一些使用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(), ^{

        });
    });
但其他人可能会这样做:

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(), ^{

        });
    });

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

如果使用
dispatch\u queue\u t queue=dispatch\u get\u global\u queue(dispatch\u queue\u PRIORITY\u HIGH,0)GCD将自动为您创建足够的线程来处理作业,并尽可能使用多个内核

另一方面,如果您使用
imageQueue\uu=dispatch\u queue\u create(“com.company.app.imageQueue”,NULL)您得到一个串行队列和先进先出行为


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

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

串行队列是一夫一妻制的,但未提交。如果给每个串行队列分配一组任务,它将一次运行一个任务,一次只使用一个线程。未提交方面是串行队列可能在任务之间切换到不同的线程。串行队列总是等待任务完成后再转到下一个任务。因此,任务是按FIFO顺序完成的。您可以根据需要创建任意数量的串行队列

主队列是一个特殊的串行队列。与其他未提交的串行队列不同,它们“约会”多个线程,但一次只约会一个线程,主队列与主线程“结合”,所有任务都在其上执行。主队列与主线程的runloop配合得很好,这样小的操作就不会阻塞UI和其他重要的部分。与所有串行队列一样,任务以FIFO顺序完成

如果串行队列是一夫一妻制的,并发队列是混杂的。他们会将任务提交到任何可用线程,甚至根据系统负载生成新线程。它们可以在不同的线程上同时执行多个任务。提交到全局队列的任务必须是线程安全的,并尽量减少副作用,这一点很重要。任务以FIFO顺序提交执行,但不保证完成顺序

返回时,默认情况下,所有全局队列都是并发的,所有用户队列都是串行的,除非将其定义为并发的

如果您的目标是下载图像,您可能需要一个串行(用户)队列。下载图像更多的是带宽问题。你通常一次只想做一件(或几件)


编辑:以上答案的博文扩展:

谢谢您的回答!根据我的经验,这个答案并不准确。用户队列可以作为并发队列创建(并发挥作用)。谢谢您的回答。因此,假设您只是使用dataWithContentsOfURL:连接到服务器以获取一些json。你会用哪一个——第一个?不必担心退货订单;我想没有线程安全问题。那么-只需使用全局队列?{可能只是默认优先级}干杯!“如果你不担心线程安全”——你应该总是担心线程安全!