Sobes.tech
Middle

Como implementar multitarefa usando filas?

sobes.tech IA

Resposta da IA

Para implementar multitarefa no iOS, utilizam-se tecnologias como GCD (Grand Central Dispatch) ou Operation Queues.

GCD (Grand Central Dispatch)

GCD é uma API de baixo nível em C para gerir tarefas em paralelo através de filas de despacho.

Conceitos principais do GCD:

  • Filas de despacho (Dispatch Queues): Estruturas de dados que gerem a execução de blocos de código (tarefas). Podem ser sequenciais (serial) ou concorrentes (concurrent).
  • Filas globais concorrentes (Global Concurrent Queues): Filas do sistema disponíveis por padrão, com diferentes prioridades (qos - Quality of Service).
  • Fila principal (Main Queue): É uma fila sequencial ligada ao thread principal da interface de utilizador. Usada para atualizar a interface.

Exemplo de uso do GCD:

import Foundation

// Obter uma fila global concorrente com alta prioridade
let globalQueue = DispatchQueue.global(qos: .userInitiated)

// Obter a fila principal
let mainQueue = DispatchQueue.main

// Executar uma tarefa de forma assíncrona na fila global
globalQueue.async {
    // Executar tarefa prolongada...
    print("A executar no thread em segundo plano")

    // Voltar à fila principal para atualizar a UI (se necessário)
    mainQueue.async {
        // Atualizar a UI...
        print("Atualizar a UI no thread principal")
    }
}

// Criar e usar uma fila personalizada sequencial
let serialQueue = DispatchQueue(label: "com.exemplo.minhaFilaSerial")

serialQueue.async {
    print("Tarefa 1 na fila sequencial")
}

serialQueue.async {
    print("Tarefa 2 na fila sequencial") // Será executada após a Tarefa 1
}

Operation Queues

Operation Queues é uma abstração de alto nível sobre o GCD, baseada em objetos Operation.

Conceitos principais das Operation Queues:

  • Operações (Operation): Objetos que representam unidades de trabalho. Podem ser subclasses de Operation (por exemplo, BlockOperation, URLSessionDownloadTask). Suportam dependências entre operações.
  • Filas de operações (OperationQueue): Objeto que gere a execução de Operation. Podem ser configuradas para limitar o número máximo de operações simultâneas (maxConcurrentOperationCount).

Exemplo de uso de Operation Queues:

import Foundation

// Criar uma fila de operações
let operationQueue = OperationQueue()

// Opcional: limitar o número de operações simultâneas
operationQueue.maxConcurrentOperationCount = 3

// Criar operações
let operation1 = BlockOperation {
    print("Operação 1 em execução")
    // Executar tarefa...
}

let operation2 = BlockOperation {
    print("Operação 2 em execução")
    // Executar tarefa...
}

// Criar uma operação com um encerramento (alternativa)
let operation3 = BlockOperation {
    print("Operação 3 em execução")
    // Executar tarefa...
}

// Adicionar um encerramento de finalização (completion block)
operation3.completionBlock = {
    print("Operação 3 finalizada")
}

// Adicionar dependências (a Operação 2 será executada após a Operação 1)
operation2.addDependency(operation1)

// Adicionar operações à fila
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)

// As operações começarão a ser executadas de forma assíncrona dependendo dos threads disponíveis e dependências

Comparação entre GCD e Operation Queues:

Característica GCD (Grand Central Dispatch) Operation Queues
Nível de abstração Baixo (API em C) Alto (classes Objective-C/Swift)
Gestão de tarefas Blocos ou funções Objetos Operation
Dependências Requer gestão manual (por exemplo, DispatchGroup) Suporte incorporado via addDependency
Cancelamento Difícil Fácil (via método cancel() da operação)
Estado Não tem estado explícito Suporta estados (ready, executing, finished)
Supervisão Requer implementação manual Suporte com KVO (Key-Value Observing)
Complexidade Melhor para tarefas simples sem necessidade de cancelamento Melhor para tarefas complexas, dependentes e canceláveis

A escolha entre GCD e Operation Queues depende da natureza da tarefa. GCD é mais leve e adequado para tarefas simples em segundo plano. Operation Queues oferecem uma gestão mais flexível, suporte para dependências e cancelamento, sendo preferíveis em cenários mais complexos de gestão de tarefas.