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
isCancelleddentro del bloque. - Un
DispatchWorkItemcancelado puede ser puesto en la cola, pero su bloque no se ejecutará siisCancelledse verifica antes de comenzar. - Llamar a
cancel()en unDispatchWorkItemque ya se ha ejecutado o cancelado no tiene efecto.
Propiedades:
| Propiedad | Tipo | Descripción |
|---|---|---|
isCancelled |
Bool |
Devuelve true si el trabajo ha sido cancelado. |