O envio de um bloco para a fila principal geralmente é feito a partir de uma fila em segundo plano para sinalizar que algum processamento em segundo plano foi concluído, por exemplo
- (void)doCalculation
{
//you can use any string instead "com.mycompany.myqueue"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(backgroundQueue, ^{
int result = <some really long calculation that takes seconds to complete>;
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult:result];
});
});
}
Nesse caso, estamos fazendo um cálculo demorado em uma fila de segundo plano e precisamos atualizar nossa interface do usuário quando o cálculo estiver concluído. A atualização da interface do usuário normalmente precisa ser feita a partir da fila principal, para que possamos 'sinalizar' de volta para a fila principal usando um segundo dispatch_async aninhado.
Provavelmente existem outros exemplos em que você pode enviar novamente para a fila principal, mas geralmente é feito dessa maneira, ou seja, aninhado de dentro de um bloco enviado para uma fila em segundo plano.
- processamento em segundo plano concluído -> atualizar interface do usuário
- parte dos dados processados na fila de segundo plano -> fila principal de sinal para iniciar a próxima parte
- dados de rede recebidos na fila de segundo plano -> fila principal de sinal de que a mensagem chegou
- etc etc
Quanto ao motivo pelo qual você pode despachar para a fila principal a partir da fila principal ... Bem, geralmente você não faria isso, embora seja concebível que você possa fazê-lo para agendar algum trabalho para a próxima vez no ciclo de execução.