Sobes.tech
Middle

Cuéntame sobre el mecanismo de cancelación en DispatchWorkItem.

sobes.tech AI

Respuesta de la IA

DispatchWorkItem representa un bloque de código que se puede programar para su ejecución en una cola de despacho, y que puede ser cancelado antes de su ejecución real.

La cancelación se implementa mediante una bandera dentro de DispatchWorkItem. El mecanismo de cancelación es cooperativo: DispatchWorkItem debe verificar regularmente su estado de cancelación.

Al llamar al método cancel() en DispatchWorkItem, se establece la bandera de cancelación. La interrupción real de la ejecución solo ocurre si dentro del bloque de código de DispatchWorkItem se verifica esta bandera mediante la propiedad isCancelled.

Ejemplo de uso:

let tarea: DispatchWorkItem = DispatchWorkItem {
    for i in 0..<100 {
        guard !self.isCancelled else { // Verificación de la bandera de cancelación
            print("Operación cancelada en la iteración \(i)")
            return // Finalizar la ejecución
        }
        // Realizar trabajo útil
        Thread.sleep(forTimeInterval: 0.1) // Simulación de una operación prolongada
    }
    print("Operación finalizada")
}

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

// Cancelar la tarea después de 1 segundo
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
    tarea.cancel()
}

Puntos clave:

  • La cancelación inmediata no está garantizada; depende de la frecuencia con la que se verifica isCancelled dentro del bloque.
  • Un DispatchWorkItem cancelado puede ser puesto en la cola, pero su bloque no se ejecutará si isCancelled se verifica antes de comenzar.
  • Llamar a cancel() en un DispatchWorkItem que ya se ha ejecutado o cancelado no tiene efecto.

Propiedades:

Propiedad Tipo Descripción
isCancelled Bool Devuelve true si el trabajo ha sido cancelado.