¿Por qué se necesita ejecutar un bucle cuando se usa DispatchQueue.main.async en la herramienta de línea de comandos de Mac en Swift?

Aug 15 2020

Encontré el documento de Apple para entender por qué debería usar el bucle de ejecución para implementar la tarea en la cola de envío principal.

Según los documentos de Apple ,

La cola de envío principal es una cola en serie disponible globalmente que ejecuta tareas en el subproceso principal de la aplicación. Esta cola funciona con el bucle de ejecución de la aplicación (si está presente) para intercalar la ejecución de tareas en cola con la ejecución de otros orígenes de eventos adjuntos al bucle de ejecución. Debido a que se ejecuta en el subproceso principal de su aplicación, la cola principal a menudo se usa como un punto de sincronización clave para una aplicación.

pero aún así, no puedo entender 'por qué' se necesita ejecutar el bucle. suena como 'necesita un bucle de ejecución porque necesita un bucle de ejecución'. Agradecería mucho si alguien me explica sobre esto. Gracias.

Respuestas

1 matt Aug 15 2020 at 19:37

¿Por qué debería usar el bucle de ejecución para implementar la tarea en la cola de envío principal?

Normalmente, no lo haces, ¡porque ya estás usando uno!

En un proyecto de aplicación, ya existe un bucle de ejecución de la cola principal . Por ejemplo, un proyecto de aplicación iOS en realidad no es más que una gigantesca llamada a UIApplicationMain, que proporciona un bucle de ejecución.

Así es como puede sentarse allí esperando que el usuario haga algo. El ciclo de ejecución está, eh, en ejecución. Y bucle.

Pero, por ejemplo, en una herramienta de línea de comandos de Mac, no hay un ciclo de ejecución automático. Ejecuta su función principal y sale inmediatamente. Si necesitara que no hiciera eso, proporcionaría un bucle de ejecución.

1 KavinduChathuranga Aug 15 2020 at 18:52

DispatchQueue.main.asynces cuando tiene código ejecutándose en una cola de fondo y necesita un bloque de código específico para ejecutarse en la cola principal.

En su código, viewDidLoadya se está ejecutando en la cola principal, por lo que hay pocas razones para usar DispatchQueue.main.async.

Pero no es necesariamente malo usarlo. Pero cambia el orden de ejecución.

el cierre asíncrono se pone en cola para ejecutarse después de que se complete el ciclo de ejecución actual.

Rob Aug 15 2020 at 23:56

no puedo entender 'por qué' se necesita ejecutar el bucle

Por lo general, no se necesita un bucle de ejecución para las aplicaciones de línea de comandos. Puede usar bucles de ejecución si tiene una necesidad especial (por ejemplo, tiene una interfaz de usuario dinámica que realiza algunas tareas mientras espera la entrada del usuario), pero la gran mayoría de las aplicaciones de línea de comandos no requieren bucles de ejecución.

Como dicen los documentos :

Un bucle de ejecución es un bucle de procesamiento de eventos que se utiliza para programar el trabajo y coordinar la recepción de eventos entrantes. El propósito de un bucle de ejecución es mantener el subproceso ocupado cuando hay trabajo que hacer y poner el subproceso en reposo cuando no hay ninguno.

Por lo tanto, si necesita que su aplicación espere algunos eventos entrantes o está despachando tareas de forma asincrónica entre colas, entonces, está bien, emplee bucles de ejecución, pero de lo contrario, no se moleste. La mayoría de las aplicaciones de línea de comandos no necesitan usar bucles de ejecución en absoluto.