Sobes.tech
Middle

Fale sobre a fila global na programação multithread no iOS.

sobes.tech IA

Resposta da IA

A fila global (Global Queue) no Grand Central Dispatch (GCD) são filas predefinidas do sistema que estão disponíveis para todas as aplicações. São filas concorrentes, o que significa que as tarefas nelas podem ser executadas em paralelo em diferentes threads.

Características principais:

  • Tipos: Variam de acordo com o nível de qualidade de serviço (QoS - Quality of Service).
  • QoS: Define a prioridade de execução das tarefas, influenciando quais tarefas o sistema deve completar mais rapidamente.
  • Paralelismo: Permitem executar múltiplas tarefas simultaneamente.
  • Sistema: São criadas e geridas pelo sistema operativo.

Tipos de filas globais (por ordem decrescente de prioridade):

Nível de QoS Descrição
userInteractive Tarefas que afetam diretamente a interface do utilizador (animações, eventos).
userInitiated Tarefas iniciadas pelo utilizador, mas que não bloqueiam a UI (carregamento de conteúdo).
default Nível por defeito sem especificação explícita de QoS.
utility Tarefas que requerem tempo de execução, mas não afetam a UI de forma imediata (carregamento de ficheiros grandes).
background Tarefas que são executadas em segundo plano, não visíveis para o utilizador (sincronização de dados).
unspecified Usado raramente quando o QoS não é importante. Equivale a default.

Acesso às filas globais:

// Obter uma fila global com um nível de QoS específico
let userInitiatedQueue = DispatchQueue.global(qos: .userInitiated)

// Obter a fila global por defeito
let defaultQueue = DispatchQueue.global()

Uso de filas globais para executar tarefas:

// Executar uma tarefa de forma assíncrona numa fila em segundo plano
DispatchQueue.global(qos: .background).async {
    // Código que demora a executar, sem bloquear a UI
}

// Executar uma tarefa de forma síncrona na fila (menos comum para filas globais)
DispatchQueue.global(qos: .userInitiated).sync {
    // Código que deve ser concluído antes de continuar com o thread atual
}

É importante lembrar:

  • Não executar tarefas que afetem diretamente a interface do utilizador em filas globais (exceto userInteractive para operações muito rápidas). Para atualizar a UI, use a fila principal (DispatchQueue.main).
  • As filas globais destinam-se à execução em paralelo. A ordem de execução das tarefas pode não estar garantida.
  • Ao usar sync numa fila global, o thread atual ficará bloqueado até que a tarefa termine. Isto pode causar bloqueio da UI se for chamado a partir do thread principal.