Работали ли с Operations и GCD в iOS
Что проверяют
Понимаете ли вы, чем очередь отличается от потока, и умеете ли выбирать инструмент под задачу. По ответу видно, писали ли вы конкурентный код сами или только пользовались готовыми обёртками.
Как отвечать
GCD это низкоуровневый интерфейс поверх пула потоков. Вы кладёте замыкание в очередь, система сама решает, на каком потоке его выполнить. Ключевая деталь: созданная вами очередь по умолчанию последовательная, параллельность включается отдельным атрибутом, а приоритет задаётся качеством обслуживания.
let queue = DispatchQueue(label: "app.images", qos: .utility)
queue.async {
let image = render()
DispatchQueue.main.async { self.imageView.image = image }
}OperationQueue построена поверх той же машинерии и даёт объект вместо замыкания: отмену, зависимости между задачами, ограничение числа одновременных операций, наблюдение за состоянием. Рабочее правило простое: одна короткая фоновая задача это GCD, конвейер из шагов с отменой и приоритетами это операции.
Сильный ответ заканчивается тем, что в новом коде обе технологии уступают структурной конкурентности с async/await и акторами: дерево задач отменяется целиком, а ручная синхронизация уходит. GCD остаётся для барьеров, таймеров и стыковки со старым кодом.
Где спотыкаются
Путают последовательную очередь с главной и вызывают DispatchQueue.main.sync из главного потока. Это мгновенная взаимная блокировка, и такой пример любят давать прямо на доске.
Вторая ошибка: ждать асинхронный результат семафором. Поток пула блокируется, при нескольких таких вызовах приложение упирается в лимит потоков, а в связке с новой моделью конкурентности подвешивает кооперативный пул целиком.
Третья: считать, что отмена останавливает работу. Она только выставляет флаг, длинный цикл обязан сам проверять isCancelled, а собственный подкласс асинхронной операции ещё и сообщать о завершении через наблюдаемые свойства состояния.