← Назад к вопросам

Какой тип дефолтный в GCD?

2.0 Middle🔥 121 комментариев
#Архитектура и паттерны#Многопоточность и асинхронность#Язык Swift

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы DispatchQueue в GCD и «дефолтный» тип

В Grand Central Dispatch (GCD) нет единого «дефолтного» типа в смысле типа очереди по умолчанию. Однако если мы говорим о типе очереди, который используется чаще всего и является наиболее естественным выбором для большинства задач — это DispatchQueue с типом .concurrent для системных глобальных очередей и .serial для создаваемых пользователем очередей. Давайте разберем подробнее.

Основные типы очередей в GCD

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

  1. Serial Dispatch Queues (Последовательные очереди) – задачи выполняются строго одна за другой в порядке их добавления.
  2. Concurrent Dispatch Queues (Параллельные очереди) – задачи могут выполняться одновременно на нескольких потоках, в зависимости от доступности системы.

Системные глобальные очереди — «дефолтные» для параллельной работы

Когда говорят о «дефолтной» очереди, часто подразумевают одну из готовых системных глобальных очередей (DispatchQueue.global), которые являются concurrent. Они предоставляются системой с различными уровнями качества обслуживания (QoS):

DispatchQueue.global(qos: .userInteractive) // Для мгновенной реакции UI
DispatchQueue.global(qos: .userInitiated)   // Для задач, начатых пользователем
DispatchQueue.global(qos: .default)         // Базовый уровень (часто используется)
DispatchQueue.global(qos: .utility)         // Для длительных задач
DispatchQueue.global(qos: .background)      // Для задач, невидимых пользователю

Именно DispatchQueue.global(qos: .default) можно считать «дефолтной» параллельной очередью системы. Если вы вызываете DispatchQueue.global() без указания QoS, будет использован именно этот уровень .default.

// Часто используемый "дефолтный" вызов для параллельной задачи
DispatchQueue.global().async {
    // Выполнение тяжелой операции, не блокирующей главный поток
}

Главная очередь — «дефолтная» для работы с UI

Для всех операций, связанных с обновлением интерфейса, «дефолтной» и единственно правильной является Main Dispatch Queue (DispatchQueue.main), которая является serial очередью, привязанной к главному потоку приложения.

// После получения данных на бэкграунд-очереди
DispatchQueue.global().async {
    let data = fetchData()
    // Возвращаем результат на "дефолтную" для UI очередь
    DispatchQueue.main.async {
        self.updateUI(with: data)
    }
}

Пользовательские очереди — «дефолтный» тип при создании

Когда вы создаете свою очередь через конструктор DispatchQueue(label:), по умолчанию она будет serial (последовательной).

// Создается последовательная очередь (дефолтный тип)
let mySerialQueue = DispatchQueue(label: "com.example.mySerialQueue")

// Чтобы создать параллельную очередь, нужно явно указать атрибут
let myConcurrentQueue = DispatchQueue(label: "com.example.myConcurrentQueue",
                                      attributes: .concurrent)

Итог: что считать «дефолтным»?

  • Для параллельного выполнения задач: «дефолтной» можно считать системную глобальную очередь с QoS .default (DispatchQueue.global()).
  • Для операций с UI: абсолютно «дефолтной» является Main Queue (DispatchQueue.main).
  • При создании новой очереди: «дефолтный» тип — serial (последовательная очередь).

Таким образом, термин «дефолтный» в GCD нужно применять контекстуально, но чаще всего он относится либо к DispatchQueue.global() для бэкграунд-работы, либо к DispatchQueue.main для UI. Понимание этого различия и типов очередей критически важно для написания эффективного, корректного и безопасного многопоточного кода на iOS.