Ответ вслух Junior GCD и OperationQueue обновлено

OperationQueue или GCD

Вопрос

Когда вы выберете OperationQueue, а когда DispatchQueue?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

GCD беру, когда нужно просто отправить работу на очередь: перейти на главный поток, сделать что-то в фоне, защитить ресурс приватной serial-очередью. Это легко и дёшево.

Что должно прозвучать в ответе

  • GCD: лёгкие блоки, простая отправка на очередь, минимум накладных расходов

  • OperationQueue: зависимости, отмена, лимит параллельности, состояние операции

  • Пример OperationQueue: загрузка с зависимостями (авторизация, потом файлы)

  • Асинхронные операции требуют ручного KVO

  • В новом коде многие задачи решают async/await и группы задач

Что могут спросить следом

  • Как сделать асинхронную операцию?
  • Чем maxConcurrentOperationCount = 1 отличается от serial-очереди?

Разбор

GCD беру, когда нужно просто отправить работу на очередь: перейти на главный поток, сделать что-то в фоне, защитить ресурс приватной serial-очередью. Это легко и дёшево. OperationQueue выбираю, когда задачи образуют граф: сначала обновить токен, потом параллельно загрузить файлы, потом собрать отчёт. Там же нужны отмена всех операций при уходе с экрана и ограничение параллельности, например не больше трёх загрузок. Операции можно отменять, у них есть состояние и KVO, но асинхронная операция требует аккуратно переопределить start и флаги. В новом коде большую часть таких задач я решаю через async/await и withTaskGroup, но в старых проектах OperationQueue всё ещё встречается часто.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме