Ответ
В 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) // Параллельная, можно городить
Вот и вся магия, блядь. Главное — не еби мозг главному потоку, скидывай работу в глобальные очереди, а результат возвращай на главную. И будет тебе счастье, а не лаги.