Какую очередь создает OperationQueue() по умолчанию?

Ответ

Конструктор OperationQueue() создает параллельную (concurrent) фоновую очередь.

Ключевые характеристики по умолчанию:

  • Тип: Concurrent (параллельная). Операции могут выполняться одновременно, если нет зависимостей.
  • Поток: Фоновый (не главный).
  • Максимум операций (maxConcurrentOperationCount): Устанавливается в -1, что позволяет системе определять оптимальное количество параллельных задач на основе числа ядер и текущей загрузки системы.
  • Качество обслуживания (qualityOfService): .background (низкий приоритет).

Пример и управление:

let queue = OperationQueue()
// Делаем очередь последовательной (serial)
queue.maxConcurrentOperationCount = 1
// Повышаем приоритет очереди
queue.qualityOfService = .userInitiated

Почему не serial? Параллельная очередь по умолчанию лучше использует ресурсы многоядерных процессоров для независимых задач.

Ответ 18+ 🔞

А, ну это ж классика, блядь! Смотри, сейчас всё разжуем, как есть.

Вот ты создаёшь OperationQueue() — и думаешь, что это такая скромная, тихая очередь, которая будет задачи по одной, как в магазине за колбасой, выполнять? А хуй там плавал, чувак!

По умолчанию это же параллельная, ёпта, очередь! То есть, если ты туда без задней мысли закинешь кучу операций, они могут стартануть все сразу, как тараканы из-под плинтуса, и начать друг другу мешать. Система сама решает, сколько их одновременно гонять, исходя из того, сколько у неё ядер и насколько она уже заебанная.

И да, работает она в фоне, не на главном потоке, с приоритетом «да похуй, сделаем когда-нибудь» (.background).

Но вся соль в том, что эту самодеятельность можно и нужно приструнить! Хочешь, чтобы операции шли строго одна за другой, как в армии? Без проблем:

let queue = OperationQueue()
// А вот тут мы её и укрощаем, блядь! Делаем последовательной.
queue.maxConcurrentOperationCount = 1
// И повышаем приоритет с «когда-нибудь» до «сейчас, сука, я жду!»
queue.qualityOfService = .userInitiated

А почему по умолчанию она параллельная? Да потому что так эффективнее, ёбана! Современные процессоры — не одноядерные калькуляторы, им дай волю — они несколько задач сразу и слопают, если те друг от друга не зависят. Но если у тебя там бардак и операции лезут друг другу в промежность — тогда да, ограничивай. Сам решай, что тебе нужно: скорость или порядок.