Какие встроенные очереди (DispatchQueue) доступны в iOS?

Ответ

В Grand Central Dispatch (GCD) доступны системные очереди с разными приоритетами Quality of Service (QoS):

1. Главная очередь (Main Queue)

  • Назначение: Все операции с пользовательским интерфейсом (UI).
  • Тип: Серийная (serial).
  • Использование:
    DispatchQueue.main.async {
    self.label.text = "Updated" // Обновление UI
    }

2. Глобальные параллельные очереди (Global Concurrent Queues)

  • Назначение: Фоновые задачи. Система управляет потоками автоматически.
  • Тип: Параллельные (concurrent).
  • Приоритеты (по убыванию важности):
    • .userInteractive — для анимаций или мгновенного отклика.
    • .userInitiated — действия, инициированные пользователем, требующие немедленного результата.
    • .default — средний приоритет по умолчанию.
    • .utility — длительные задачи (загрузка, обработка).
    • .background — задачи, невидимые пользователю (очистка, синхронизация).
DispatchQueue.global(qos: .utility).async {
    let data = fetchDataFromNetwork() // Длительная задача
    DispatchQueue.main.async { self.updateUI(with: data) }
}

3. Пользовательские очереди (Custom Queues)

  • Назначение: Создание собственных серийных или параллельных очередей для контроля и изоляции задач.
    let serialQueue = DispatchQueue(label: "com.app.serialQueue") // Серийная по умолчанию
    let concurrentQueue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent)

Ответ 18+ 🔞

А, слушай-ка, про эти ваши GCD-очереди, блядь. Ну, типа, чтобы не пиздеть в главный поток как последний распиздяй и не подвисать интерфейсом.

Так, смотри, у системы там уже всё готовенькое, не надо самому потоки плодить, как тараканов. Вот они, сука, готовые очереди:

Первая — Главная (Main Queue). Это, блядь, святое место, ёпта! Туда только обновлять интерфейс. Всё, что касается кнопочек, текстов, анимаций — только туда, и только async, чтоб не заблокировать всё к хуям собачьим. Серийная она, то есть задачи по одной выполняет.

DispatchQueue.main.async {
    self.label.text = "Updated" // Вот так, блядь, правильно. Не в лоб, а через очередь.
}

Вторые — Глобальные параллельные (Global Concurrent Queues). Вот это, блядь, рабочие лошадки! Для всей фоновой хуйни. Они параллельные, система сама решает, сколько потоков запустить. Но у них, сука, есть градация, QoS называется, чтоб не путать срочное с не очень.

Смотри, по убыванию важности, как начальство на совещании:

  • .userInteractive — Самый срочный, блядь. Для анимаций или когда пользователь тычет пальцем и ждёт мгновенной реакции. Ебать как важно.
  • .userInitiated — Пользователь нажал кнопку «загрузить», и ждёт, сука, результата. Тоже быстро надо.
  • .default — Среднячок, по умолчанию. Если не знаешь куда — пихай сюда, не ошибёшься.
  • .utility — Для долгих, неторопливых дел. Типа загрузки файла или обработки фотки. Можно подождать.
  • .background — Вообще похуй, когда выполнится. Очистка кэша, синхронизация какой-нибудь — делай в фоне, хоть ночью.
DispatchQueue.global(qos: .utility).async { // Берём глобальную очередь для долгих дел
    let data = fetchDataFromNetwork() // Тянем с сервака, ебать его в сраку
    DispatchQueue.main.async { self.updateUI(with: data) } // А результат — на главную, в UI!
}

Третьи — Пользовательские (Custom Queues). Ну а если тебе, блядь, мало системных, или хочешь свою песочницу, чтобы задачи не мешались с другими — вот тебе конструктор.

let serialQueue = DispatchQueue(label: "com.app.serialQueue") // Серийная по умолчанию, задачи одна за другой
let concurrentQueue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent) // Параллельная, можно городить

Вот и вся магия, блядь. Главное — не еби мозг главному потоку, скидывай работу в глобальные очереди, а результат возвращай на главную. И будет тебе счастье, а не лаги.