OperationQueue умеет зависимости между операциями, отмену, лимит одновременных операций и наблюдение за состоянием. У GCD есть очереди и группы, но нет объекта «задача» с этими рычагами.
Дополнительные вопросы
1. Свойством maxConcurrentOperationCount. Значение 1 делает очередь серийной по факту выполнения.
2. В GCD это DispatchGroup: enter на старте, leave в конце, notify когда счётчик нулевой. В OperationQueue у финальной операции добавляют зависимости на все параллельные, и она стартует последней.
3. cancel ставит isCancelled. Уже выполняющееся тело само не обрывается. Операция должна проверять флаг и выйти. Если она ещё не стартовала, до работы дело может не дойти.