Выбор ответа Senior GCD и OperationQueue обновлено
Асинхронная Operation
Вопрос
Почему подкласс Operation, который в main() запускает URLSession.dataTask и сразу возвращается, работает неправильно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Операция завершена при выходе из main(); для async нужен свой start(). Синхронная операция завершается, когда возвращается main().
Варианты ответа
URLSessionнельзя вызывать из операций, нуженURLSessionTaskвне очереди- Операция завершена при выходе из
main(); для async нужен свойstart()правильный ответ - Операции всегда выполняются на главном потоке, и запрос блокирует UI
main()вызывается дважды, и запрос отправляется два раза подряд
Разбор
Синхронная операция завершается, когда возвращается main(). Сетевой запрос продолжится, но очередь уже считает операцию выполненной: зависимые операции стартуют раньше времени, лимит параллельности не соблюдается. Асинхронную операцию делают через start() и ручное управление флагами с уведомлениями KVO, а isFinished = true выставляют в completion запроса. URLSession в операциях использовать можно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «GCD и OperationQueue»
- Инверсия приоритетов
- DispatchSemaphore для ограничения параллельности
- DispatchWorkItem и отмена
- Как дождаться нескольких запросов в GCD
- Задача на Swift: операции с зависимостями и критический путь
- Задача на Swift: OperationQueue с ограничением параллельности
- DispatchQueue.main.sync на главном потоке
- Инструменты GCD и их задачи