Sobes.tech
Middle

Fale-me sobre o mecanismo de cancelamento no DispatchWorkItem.

sobes.tech IA

Resposta da IA

DispatchWorkItem representa um bloco de código que pode ser agendado para execução numa fila de despacho, e que pode ser cancelado antes da sua execução real.

A cancelamento é implementado através de uma bandeira dentro de DispatchWorkItem. O mecanismo de cancelamento é cooperativo: DispatchWorkItem deve verificar regularmente o seu estado de cancelamento.

Ao chamar o método cancel() em DispatchWorkItem, a bandeira de cancelamento é definida. A interrupção real da execução só ocorre se, dentro do bloco de código de DispatchWorkItem, essa verificação for feita usando a propriedade isCancelled.

Exemplo de uso:

let tarefa: DispatchWorkItem = DispatchWorkItem {
    for i in 0..<100 {
        guard !self.isCancelled else { // Verificação da bandeira de cancelamento
            print("Operação cancelada na iteração \(i)")
            return // Encerrar a execução
        }
        // Realizar trabalho útil
        Thread.sleep(forTimeInterval: 0.1) // Simulação de uma operação longa
    }
    print("Operação concluída")
}

DispatchQueue.global().async(execute: tarefa)

// Cancelar o trabalho após 1 segundo
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
    tarefa.cancel()
}

Pontos-chave:

  • Cancelamento imediato não é garantido; depende da frequência de verificação de isCancelled dentro do bloco.
  • Um DispatchWorkItem cancelado pode ser colocado na fila, mas seu bloco não será executado se isCancelled for verificado antes do início.
  • Chamar cancel() em um DispatchWorkItem já executado ou cancelado não tem efeito.

Propriedades:

Propriedade Tipo Descrição
isCancelled Bool Retorna true se o trabalho foi cancelado.