Sobes.tech
Middle

Como cancelar a execução de tarefas síncronas no iOS?

sobes.tech IA

Resposta da IA

Não há uma cancelamento direta de tarefas síncronas (que bloqueiam o thread atual) sem interromper a execução do thread.

Para simular o cancelamento de uma tarefa síncrona, pode usar as seguintes abordagens:

  1. Verificação regular de uma bandeira de cancelamento: Adicione na lógica da tarefa síncrona uma verificação de uma bandeira booleana, que é definida externamente quando é necessário cancelar. Se a bandeira estiver definida, a tarefa termina prematuramente.

    var isCancelled = false
    
    func performSynchronousTask() {
        // Início da tarefa
        for i in 0..<100000 {
            if isCancelled {
                print("Tarefa cancelada")
                return // Saída antecipada
            }
            // Execução de parte do trabalho
            // ... cálculos longos ou operações
        }
        print("Tarefa concluída")
    }
    
    func cancelTask() {
        isCancelled = true
    }
    
    // Exemplo de uso
    // performSynchronousTask() // Chamada síncrona
    // cancelTask() // Chamar de outro thread para cancelar
    
  2. Uso de try? Task.checkCancellation() em um contexto assíncrono: Se a tarefa síncrona for executada dentro de Task em um contexto assíncrono do Swift Concurrency, pode chamá-la periodicamente. Se a tarefa for cancelada, essa chamada lançará um CancellationError.

    func performCancellableSynchronousWork() throws {
        for i in 0..<100000 {
            try Task.checkCancellation() // Verificação de cancelamento
            // Execução de parte do trabalho
            // ...
        }
    }
    
    // Exemplo de uso em um contexto assíncrono
    /*
    let task = Task {
        do {
            try performCancellableSynchronousWork()
            print("Tarefa concluída")
        } catch is CancellationError {
            print("Tarefa cancelada")
        } catch {
            print("Ocorreu um erro: \(error)")
        }
    }
    
    // Para cancelar a tarefa
    // task.cancel()
    */