Зачем нужен цикл выполнения при использовании DispatchQueue.main.async в инструменте командной строки mac в Swift?

Aug 15 2020

Я нашел документ Apple, чтобы понять, почему я должен использовать цикл выполнения для реализации задачи в основной очереди отправки.

Согласно документам Apple ,

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

но все же я не могу понять, зачем нужен цикл выполнения. это звучит как «ему нужен цикл выполнения, потому что ему нужен цикл выполнения». Я буду очень признателен, если мне кто-нибудь объяснит по этому поводу. Спасибо.

Ответы

1 matt Aug 15 2020 at 19:37

почему я должен использовать цикл выполнения для выполнения задачи в основной очереди отправки

Обычно вы этого не делаете, потому что вы уже используете его!

В проекте приложения, есть основной цикл очередь выполнения уже . Например, проект приложения для iOS на самом деле представляет собой не что иное, как один гигантский вызов UIApplicationMain, который обеспечивает цикл выполнения.

Вот как он может сидеть и ждать, пока пользователь что-то сделает. Цикл выполнения работает. И зацикливание.

Но, скажем, в инструменте командной строки Mac нет автоматического цикла выполнения. Он выполняет свою основную функцию и немедленно завершает работу. Если вам нужно, чтобы этого не происходило, вы должны предоставить цикл выполнения.

1 KavinduChathuranga Aug 15 2020 at 18:52

DispatchQueue.main.async это когда у вас есть код, работающий в фоновой очереди, и вам нужен определенный блок кода, который будет выполняться в основной очереди.

В вашем коде viewDidLoadон уже работает в основной очереди, поэтому нет особых причин использовать DispatchQueue.main.async.

Но не обязательно использовать это неправильно. Но это меняет порядок выполнения.

асинхронное закрытие ставится в очередь для запуска после завершения текущего цикла выполнения.

Rob Aug 15 2020 at 23:56

Я не могу понять, зачем нужен цикл выполнения

Как правило, для приложений командной строки цикл выполнения не требуется. Вы можете использовать циклы выполнения, если они вам особенно нужны (например, у вас есть динамический пользовательский интерфейс, который выполняет некоторые задачи, пока вы ждете ввода данных пользователем), но подавляющему большинству приложений командной строки циклы выполнения не требуются.

Как говорится в документах :

Цикл выполнения - это цикл обработки событий, который вы используете для планирования работы и координации получения входящих событий. Цель цикла выполнения - держать ваш поток занятым, когда есть работа, и переводить ваш поток в спящий режим, когда ее нет.

Итак, если вам нужно, чтобы ваше приложение ожидало некоторых входящих событий или вы распределяете задачи асинхронно между очередями, тогда, хорошо, используйте циклы выполнения, но в противном случае не беспокойтесь. Большинству приложений командной строки вообще не нужно использовать циклы выполнения.