В чем разница между «глобальной очередью» и «основной очередью» в GCD? - PullRequest
52 голосов
/ 07 марта 2012

Среди некоторых других способов есть два способа получения очередей в GCD:

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_get_main_queue();

Если я не совсем ошибаюсь, «основная очередь» выполняется в основном потоке иподходит для блоков «обратного вызова», которые выполняют работу пользовательского интерфейса.

Означает ли это, что глобальная очередь - это та, которая выполняется в фоновом потоке?

Ответы [ 5 ]

75 голосов
/ 07 марта 2012

Основная очередь действительно работает в главном потоке, как вы говорите.

Глобальные очереди являются параллельными очередями и с главной страницы для dispatch_get_global_queue:

В отличие от основной очереди или очередей, выделенных dispatch_queue_create (), глобальные параллельные очереди планировать блоки, как только потоки становятся доступными (порядок завершения «не FIFO»). Глобальный одновременный очереди представляют три приоритетные полосы:

       •   DISPATCH_QUEUE_PRIORITY_HIGH
       •   DISPATCH_QUEUE_PRIORITY_DEFAULT
       •   DISPATCH_QUEUE_PRIORITY_LOW

Блоки, отправленные в глобальную очередь с высоким приоритетом, будут вызываться раньше, чем блоки, отправленные в глобальные очереди по умолчанию или с низким приоритетом. Блоки, отправленные в глобальную очередь с низким приоритетом, будут Вызывается, если в очередях по умолчанию или очередях с высоким приоритетом нет ожидающих блоков.

Итак, это очереди, которые запускаются в фоновых потоках по мере их появления. Они "не FIFO", поэтому заказ не гарантируется.

26 голосов
/ 30 января 2014

Все 5 очередей (4 фоновых, 1 основная) имеют разные приоритеты потоков (-[NSThread threadPriority]):

                            -main- : 0.758065
      DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258
   DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000
       DISPATCH_QUEUE_PRIORITY_LOW : 0.467742
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000

(протестировано на iPod 4-го поколения и симуляторе на MacBook Pro)

7 голосов
/ 07 марта 2012

Да.Вы можете запустить такой код на устройстве, чтобы проверить его:

dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"Block 1a");
            NSAssert(![NSThread isMainThread], @"Wrong thread!");
            NSLog(@"Block 1b");
        });
dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"Block 2a");
                    NSAssert([NSThread isMainThread], @"Wrong thread!");
                    NSLog(@"Block 2b");
                });
        });
3 голосов
/ 01 июня 2017

Глобальная очередь отправки:

  1. Задачи в параллельной очереди выполняются одновременно [фоновые потоки]
  2. Задачи по-прежнему запускаются в том порядке, в котором они были добавлены в очередь

Основная очередь отправки:

  1. Доступна последовательная очередь, которая выполняет задачи в главном приложении нить.
  2. Обычно вызывается из фоновой очереди, когда некоторые фоновая обработка завершена, и пользовательский интерфейс должен быть обновленным.
1 голос
/ 07 марта 2019

GCD предоставляет три основных типа очередей:

  1. Main queue: выполняется в основном потоке и является последовательной очередью.Это обычный выбор для обновления пользовательского интерфейса после завершения работы в задаче в параллельной очереди.

  2. Global queues: одновременные очереди, общие для всей системы.Это обычный выбор для выполнения работы без пользовательского интерфейса в фоновом режиме.Существует четыре таких очереди с разными приоритетами: high, default, low и background.Фоновая очередь с приоритетами имеет самый низкий приоритет и регулируется в любой операции ввода-вывода, чтобы минимизировать негативное влияние на систему.При настройке глобальных параллельных очередей вы не указываете приоритет напрямую.Вместо этого вы указываете Quality of Service (QoS) свойство класса:

    a.User-interactive - Это представляет задачи, которые должны быть выполнены немедленно, чтобы обеспечить хороший пользовательский опыт.Это должно работать в главном потоке .

    b.User-initiated - Представляет задачи, которые инициируются из пользовательского интерфейса и могут выполняться асинхронно.Его следует использовать, когда пользователь ожидает немедленных результатов и задач, необходимых для продолжения взаимодействия с пользователем.

    c.Utility - Это представляет длительные задачи, обычно с видимым пользователем индикатором прогресса.Используйте его для вычислений , ввода-вывода , сетей , непрерывных потоков данных и подобных задач.Этот класс предназначен для энергосбережения.

    д.Background - Это представляет задачи, о которых пользователь не знает напрямую.Используйте его для предварительной выборки, обслуживания и других задач, которые не требуют взаимодействия с пользователем и не зависят от времени.

  3. Custom queues: запросы в этих очередях фактически попадают в одну из глобальных очередей.Очереди, которые вы создаете, могут быть

    a.Serial Queue - Единственная глобальная последовательная очередь - это DispatchQueue.main, но вы можете создать частную последовательную очередь.

    б.Concurrent Queue - Хороший выбор, если вы хотите выполнять фоновую работу последовательно и отслеживать ее.

Подробнее здесь , здесь

...