Sobes.tech
Middle

É possível cancelar uma tarefa adicionada à fila posteriormente?

sobes.tech IA

Resposta da IA

Sim, é possível, se a tarefa ainda não tiver começado a ser executada.

Para Operation: Pode chamar o método cancel(). Se a operação já estiver em andamento, a bandeira isCancelled será definida como true, e o programador deve lidar com a sua cancelamento dentro da lógica da operação.

let operation = BlockOperation {
    // Lógica da operação, que deve verificar operation.isCancelled
    if OperationQueue.current?.isCancelled ?? false {
        print("Operação cancelada")
        return
    }
    // Trabalho adicional
}

let queue = OperationQueue()
queue.addOperation(operation)

// Mais tarde, se necessário cancelar
operation.cancel()

Para DispatchWorkItem: Uma instância de DispatchWorkItem é criada, que depois é enviada para a fila. Para cancelar, chama-se o método cancel(). Como com Operation, isto é uma bandeira para o programador.

let item = DispatchWorkItem {
    // Lógica da tarefa, que deve verificar item.isCancelled
    if item.isCancelled {
        print("Tarefa cancelada")
        return
    }
    // Trabalho adicional
}

let queue = DispatchQueue.global()
queue.async(execute: item)

// Mais tarde, se necessário cancelar
item.cancel()

Para cancelar uma tarefa que já começou a execução, é necessário que o código dentro da tarefa verifique explicitamente a bandeira de cancelamento (isCancelled). Se a tarefa não verificar esta bandeira, ela continuará a execução até ao fim.