OperationQueue или GCD
Вопрос
Когда вы выберете OperationQueue, а когда DispatchQueue?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
GCD: лёгкие блоки, простая отправка на очередь, минимум накладных расходов
OperationQueue: зависимости, отмена, лимит параллельности, состояние операции
Пример OperationQueue: загрузка с зависимостями (авторизация, потом файлы)
Асинхронные операции требуют ручного KVO
В новом коде многие задачи решают async/await и группы задач
Что могут спросить следом
- Как сделать асинхронную операцию?
- Чем
maxConcurrentOperationCount = 1отличается от serial-очереди?
Разбор
GCD беру, когда нужно просто отправить работу на очередь: перейти на главный поток, сделать что-то в фоне, защитить ресурс приватной serial-очередью. Это легко и дёшево. OperationQueue выбираю, когда задачи образуют граф: сначала обновить токен, потом параллельно загрузить файлы, потом собрать отчёт. Там же нужны отмена всех операций при уходе с экрана и ограничение параллельности, например не больше трёх загрузок. Операции можно отменять, у них есть состояние и KVO, но асинхронная операция требует аккуратно переопределить start и флаги. В новом коде большую часть таких задач я решаю через async/await и withTaskGroup, но в старых проектах OperationQueue всё ещё встречается часто.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «GCD и OperationQueue»
- Асинхронная Operation
- Барьер для потокобезопасного кеша
- Инверсия приоритетов
- DispatchSemaphore для ограничения параллельности
- DispatchWorkItem и отмена
- Как дождаться нескольких запросов в GCD
- Задача на Swift: операции с зависимостями и критический путь
- Задача на Swift: OperationQueue с ограничением параллельности