¿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?
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
¿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.
DispatchQueue.main.async
es 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,
viewDidLoad
ya 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.
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.