Выбор ответа Senior GCD и OperationQueue обновлено

Асинхронная Operation

Вопрос

Почему подкласс Operation, который в main() запускает URLSession.dataTask и сразу возвращается, работает неправильно?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Операция завершена при выходе из main(); для async нужен свой start(). Синхронная операция завершается, когда возвращается main().

Варианты ответа

  1. URLSession нельзя вызывать из операций, нужен URLSessionTask вне очереди
  2. Операция завершена при выходе из main(); для async нужен свой start()правильный ответ
  3. Операции всегда выполняются на главном потоке, и запрос блокирует UI
  4. main() вызывается дважды, и запрос отправляется два раза подряд

Разбор

Синхронная операция завершается, когда возвращается main(). Сетевой запрос продолжится, но очередь уже считает операцию выполненной: зависимые операции стартуют раньше времени, лимит параллельности не соблюдается. Асинхронную операцию делают через start() и ручное управление флагами с уведомлениями KVO, а isFinished = true выставляют в completion запроса. URLSession в операциях использовать можно.

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

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

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