В чем разница OperationQueue и GCD
Что проверяют
Понимаете ли вы, что это разные уровни одного и того же, и умеете ли выбирать по задаче. Заодно смотрят, знаете ли вы, что оба постепенно уступают структурированной конкурентности.
Как отвечать
GCD это низкоуровневый механизм: очереди и замыкания. Отправили работу в очередь, она выполнилась. Управлять ей после отправки почти нельзя.
OperationQueue построен поверх той же инфраструктуры и добавляет объектную модель:
- отмена: у операции есть
cancel()и флагisCancelled, который сама операция обязана проверять; - зависимости:
operationB.addDependency(operationA), и вторая не начнётся раньше первой; - ограничение параллелизма:
maxConcurrentOperationCount, чего у глобальных очередей GCD нет; - приоритеты и наблюдение за состоянием:
isReady,isExecuting,isFinished, готовыеBlockOperationи подклассыOperation; - приостановка очереди целиком через
isSuspended.
Плата за это: больше кода и накладных расходов, а для асинхронной операции придётся писать собственный подкласс с ручным управлением состоянием.
Правило выбора: разовая простая работа, переход в фон и обратно в главный поток, это GCD. Пакет задач с зависимостями, отменой и ограничением одновременных загрузок, это OperationQueue.
Сильный ответ добавляет: в новом коде обе технологии всё чаще заменяются на async/await и TaskGroup, где отмена встроена в модель, а зависимость задаётся самим порядком вызовов.
Где спотыкаются
Считают, что cancel() прерывает выполняющуюся операцию. Он лишь ставит флаг, проверять его должен сам код.
Пытаются ограничить параллелизм в GCD и не знают про семафор как единственный способ.
Не упоминают главную очередь: обновление интерфейса возможно только на ней, независимо от выбранного механизма.