Por que o loop de execução é necessário ao usar DispatchQueue.main.async na ferramenta de linha de comando mac em Swift?

Aug 15 2020

Encontrei o documento da Apple para entender por que devo usar o loop de execução para implementar a tarefa na fila de despacho principal.

De acordo com os documentos da Apple ,

A fila de despacho principal é uma fila serial globalmente disponível que executa tarefas no thread principal do aplicativo. Essa fila funciona com o loop de execução do aplicativo (se houver) para intercalar a execução de tarefas enfileiradas com a execução de outras fontes de eventos anexadas ao loop de execução. Como ela é executada no thread principal do aplicativo, a fila principal geralmente é usada como um ponto de sincronização de chave para um aplicativo.

mas ainda assim, não consigo entender 'por que' o loop de execução é necessário. soa como 'precisa de um loop de execução porque precisa de um loop de execução'. Eu apreciarei muito se alguém me explicar sobre isso. Obrigada.

Respostas

1 matt Aug 15 2020 at 19:37

por que devo usar o loop de execução para implementar a tarefa na fila de despacho principal

Normalmente não, porque você já está usando um!

Em um projeto de aplicativo, já existe um loop de execução da fila principal . Por exemplo, um projeto de aplicativo iOS nada mais é do que uma chamada gigantesca para UIApplicationMain, que fornece um loop de execução.

É assim que ele consegue ficar sentado esperando que o usuário faça alguma coisa. O loop de execução está, uh, em execução. E looping.

Mas, digamos, em uma ferramenta de linha de comando do Mac, não há loop de execução automática. Ele executa sua função principal e sai imediatamente. Se você não precisasse fazer isso, forneceria um loop de execução.

1 KavinduChathuranga Aug 15 2020 at 18:52

DispatchQueue.main.asyncé quando você tem um código em execução em uma fila em segundo plano e precisa que um bloco específico de código seja executado na fila principal.

Em seu código, viewDidLoadjá está sendo executado na fila principal, portanto, há poucos motivos para usar DispatchQueue.main.async.

Mas não é necessariamente errado usá-lo. Mas muda a ordem de execução.

fechamento assíncrono é colocado na fila para ser executado após a conclusão do runloop atual.

Rob Aug 15 2020 at 23:56

não consigo entender 'por que' o loop de execução é necessário

Geralmente, um loop de execução não é necessário para aplicativos de linha de comando. Você pode usar loops de execução se tiver uma necessidade especial de um (por exemplo, você tem alguma IU dinâmica que está executando algumas tarefas enquanto espera pela entrada do usuário), mas a grande maioria dos aplicativos de linha de comando não requer loops de execução.

Como dizem os docs :

Um loop de execução é um loop de processamento de eventos que você usa para planejar o trabalho e coordenar o recebimento de eventos de entrada. O propósito de um loop de execução é manter seu thread ocupado quando há trabalho a fazer e colocá-lo para dormir quando não há nenhum.

Portanto, se você precisar que seu aplicativo aguarde alguns eventos recebidos ou se estiver despachando tarefas de forma assíncrona entre as filas, tudo bem, use loops de execução, mas, caso contrário, não se preocupe. A maioria dos aplicativos de linha de comando não precisa usar loops de execução.