Установка бесконечного выполнения (indefinite execution) для асинхронных функций на Playground.

Я часто использую Playground для того, чтобы тестировать JSON реакцию, которую мы получаем из API некоторого web сайта, это действительно очень быстрое тестирования без использования симулятора.

Допустим, у нас есть код URLSession для получения JSON данных о Car наподобие того, как это представлено на Playground:

После выполнения этого кода, вы можете заметить, что данные с сайта НЕ показываются на консоли, но если вы запустите тот же самый код в Xcode проекте, то он будет работать! 😫

Это происходит потому, что по умолчанию Playground остановит выполнение кода, когда достигнет последней строки этого кода. После выполнения последней строки кода task.resume(), Playground немедленно остановит выполнение кода, даже перед тем, как будет получена JSON рекцию, так что замыкание completionHandler метода URLSession не получить шанса выполниться и выход не будет показан.

Вот как выглядит визуальное объяснение:

Для того, чтобы вернуть Playground возможность дождаться JSON реакции, мы можем добавить некоторый код для того, чтобы сообщить Playground, что следует продолжать выполнение кода до тех пор, пока мы сами не остановим это выполнение :

Давайте опять запустим выполнение кода на Playground и Playground будет продолжать выполнение кода, ожидая получение JSON реакцию и его парсинг:

Не забудьте кликнуть на кнопке Stop, когда вы получили JSON реакцию, для того, чтобы сохранить процессорное время CPU.

Наличие кода PlaygroundPage.current.needsIndefiniteExecution = true очень полезна для случая использования асинхронных функций, результат действия которых не возвращается немедленно на Playground.

Программная остановка выполнения кода на Playground.

Рекомендуется использовать код PlaygroundPage.current.finishExecution() для остановки выполнения кода на Playground программным образом. В этом случае нет необходимости в запоминании того, что нужно не забыть кликнуть на кнопке Stop.

Мы можем инструктировать Playground о том, что нужно остановить выполнение кода, если добавим строку PlaygroundPge.current.finishExecution() внутри замыкания completionHandler. Это заставит Playground остановить выполнение кода сразу же после парсинга полученного JSON или после обнаружения ошибки при парсинге JSON.

Это перевод фрагмента статьи Tips for using Xcode Playground.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.