Зачем нужен цикл выполнения при использовании DispatchQueue.main.async в инструменте командной строки mac в Swift?
Я нашел документ Apple, чтобы понять, почему я должен использовать цикл выполнения для реализации задачи в основной очереди отправки.
Согласно документам Apple ,
Основная очередь отправки - это глобально доступная последовательная очередь, которая выполняет задачи в основном потоке приложения. Эта очередь работает с циклом выполнения приложения (если он есть), чтобы чередовать выполнение поставленных в очередь задач с выполнением других источников событий, прикрепленных к циклу выполнения. Поскольку она выполняется в основном потоке вашего приложения, основная очередь часто используется в качестве ключевой точки синхронизации для приложения.
но все же я не могу понять, зачем нужен цикл выполнения. это звучит как «ему нужен цикл выполнения, потому что ему нужен цикл выполнения». Я буду очень признателен, если мне кто-нибудь объяснит по этому поводу. Спасибо.
Ответы
почему я должен использовать цикл выполнения для выполнения задачи в основной очереди отправки
Обычно вы этого не делаете, потому что вы уже используете его!
В проекте приложения, есть основной цикл очередь выполнения уже . Например, проект приложения для iOS на самом деле представляет собой не что иное, как один гигантский вызов UIApplicationMain, который обеспечивает цикл выполнения.
Вот как он может сидеть и ждать, пока пользователь что-то сделает. Цикл выполнения работает. И зацикливание.
Но, скажем, в инструменте командной строки Mac нет автоматического цикла выполнения. Он выполняет свою основную функцию и немедленно завершает работу. Если вам нужно, чтобы этого не происходило, вы должны предоставить цикл выполнения.
DispatchQueue.main.async
это когда у вас есть код, работающий в фоновой очереди, и вам нужен определенный блок кода, который будет выполняться в основной очереди.В вашем коде
viewDidLoad
он уже работает в основной очереди, поэтому нет особых причин использовать DispatchQueue.main.async.Но не обязательно использовать это неправильно. Но это меняет порядок выполнения.
асинхронное закрытие ставится в очередь для запуска после завершения текущего цикла выполнения.
Я не могу понять, зачем нужен цикл выполнения
Как правило, для приложений командной строки цикл выполнения не требуется. Вы можете использовать циклы выполнения, если они вам особенно нужны (например, у вас есть динамический пользовательский интерфейс, который выполняет некоторые задачи, пока вы ждете ввода данных пользователем), но подавляющему большинству приложений командной строки циклы выполнения не требуются.
Как говорится в документах :
Цикл выполнения - это цикл обработки событий, который вы используете для планирования работы и координации получения входящих событий. Цель цикла выполнения - держать ваш поток занятым, когда есть работа, и переводить ваш поток в спящий режим, когда ее нет.
Итак, если вам нужно, чтобы ваше приложение ожидало некоторых входящих событий или вы распределяете задачи асинхронно между очередями, тогда, хорошо, используйте циклы выполнения, но в противном случае не беспокойтесь. Большинству приложений командной строки вообще не нужно использовать циклы выполнения.