Pourquoi une boucle d'exécution est-elle nécessaire lors de l'utilisation de DispatchQueue.main.async dans l'outil de ligne de commande mac dans Swift ?

Aug 15 2020

J'ai trouvé le document d'Apple pour comprendre pourquoi je devrais utiliser la boucle d'exécution pour implémenter une tâche dans la file d'attente principale.

D'après la documentation d' Apple ,

La file d'attente de répartition principale est une file d'attente série disponible dans le monde entier qui exécute des tâches sur le thread principal de l'application. Cette file d'attente fonctionne avec la boucle d'exécution de l'application (le cas échéant) pour entrelacer l'exécution des tâches en file d'attente avec l'exécution d'autres sources d'événements attachées à la boucle d'exécution. Parce qu'elle s'exécute sur le thread principal de votre application, la file d'attente principale est souvent utilisée comme point de synchronisation clé pour une application.

mais encore, je ne comprends pas «pourquoi» la boucle d'exécution est nécessaire. cela ressemble à "il a besoin d'une boucle d'exécution car il a besoin d'une boucle d'exécution". J'apprécierai beaucoup que quelqu'un m'explique à ce sujet. Merci.

Réponses

1 matt Aug 15 2020 at 19:37

pourquoi je devrais utiliser la boucle d'exécution pour implémenter la tâche dans la file d'attente de répartition principale

Normalement, vous ne le faites pas, car vous en utilisez déjà un !

Dans un projet d'application, il existe déjà une boucle d'exécution de file d'attente principale . Par exemple, un projet d'application iOS n'est en fait rien d'autre qu'un gigantesque appel à UIApplicationMain, qui fournit une boucle d'exécution.

C'est ainsi qu'il est capable d'attendre que l'utilisateur fasse quelque chose. La boucle d'exécution est, euh, en cours d'exécution. Et en boucle.

Mais dans, disons, un outil de ligne de commande Mac, il n'y a pas de boucle d'exécution automatique. Il exécute sa fonction principale et se termine immédiatement. Si vous en aviez besoin pour ne pas le faire, vous fourniriez une boucle d'exécution.

1 KavinduChathuranga Aug 15 2020 at 18:52

DispatchQueue.main.asyncc'est lorsque vous avez du code en cours d'exécution sur une file d'attente en arrière-plan et que vous avez besoin d'un bloc de code spécifique à exécuter sur la file d'attente principale.

Dans votre code, viewDidLoadest déjà en cours d'exécution sur la file d'attente principale, il n'y a donc aucune raison d'utiliser DispatchQueue.main.async.

Mais ce n'est pas nécessairement mal de l'utiliser. Mais cela change l'ordre d'exécution.

La fermeture asynchrone est mise en file d'attente pour s'exécuter après la fin de la boucle d'exécution en cours.

Rob Aug 15 2020 at 23:56

je ne comprends pas 'pourquoi' la boucle d'exécution est nécessaire

Généralement, une boucle d'exécution n'est pas nécessaire pour les applications en ligne de commande. Vous pouvez utiliser des boucles d'exécution si vous en avez un besoin particulier (par exemple, vous avez une interface utilisateur dynamique qui exécute certaines tâches pendant que vous attendez l'entrée de l'utilisateur), mais la grande majorité des applications en ligne de commande ne nécessitent pas de boucles d'exécution.

Comme disent les docs :

Une boucle d'exécution est une boucle de traitement d'événements que vous utilisez pour planifier le travail et coordonner la réception des événements entrants. Le but d'une boucle d'exécution est de garder votre thread occupé lorsqu'il y a du travail à faire et de mettre votre thread en veille lorsqu'il n'y en a pas.

Donc, si vous avez besoin que votre application attende certains événements entrants ou que vous répartissiez des tâches de manière asynchrone entre les files d'attente, alors, très bien, utilisez des boucles d'exécution, mais sinon, ne vous embêtez pas. La plupart des applications en ligne de commande n'ont pas du tout besoin d'utiliser des boucles d'exécution.