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