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
isCancelleddentro do bloco. - Um
DispatchWorkItemcancelado pode ser colocado na fila, mas seu bloco não será executado seisCancelledfor verificado antes do início. - Chamar
cancel()em umDispatchWorkItemjá executado ou cancelado não tem efeito.
Propriedades:
| Propriedade | Tipo | Descrição |
|---|---|---|
isCancelled |
Bool |
Retorna true se o trabalho foi cancelado. |