the programming programacion para lenguaje language examples descargar apple swift macos swift3

programming - swift ubuntu



Descartar el controlador de vista que no detiene la tarea asincrónica (2)

No hay API que pueda cancelar la ejecución del hilo. En cambio, puede agregar una bandera de cancelación para verificar la respuesta de manejo.

var dispatchItem:DispatchWorkItem! func executeDispatch() { dispatchItem = DispatchWorkItem { for i in 1...200 { sleep(1) if !(self.dispatchItem.isCancelled) { print("item /(i)") }else { print("cancel") } } DispatchQueue.global().async(execute: dispatchItem) } func stop(_ sender: Any) { DispatchQueue.global().async { self.dispatchItem.cancel() } }

Estoy usando el siguiente código para hacer algunas operaciones de fondo complejas desde un controlador de vista recién lanzado

let globalQueue = DispatchQueue.global() globalQueue.async { //complex job }

Cuando el usuario hace clic en el botón cancelar, yo llamo

self.dismissViewController(self)

Pero parece que esto no detiene la tarea de fondo.

¿Como puedó resolver esté problema?


Crea el elemento de trabajo de despacho.

//create the dispatch work item var disptachWorkItem:DispatchWorkItem?

Ahora ponga la tarea compleja en el elemento de trabajo de despacho.

dispatchWorkItem = DispatchWorkItem { //Some complex job }

Ejecute el trabajo en la cola global predeterminada.

DispatchQueue.global().async(execute: dispatchWorkItem!)

Puede averiguar cuándo se está descartando ViewController.

DispatchQueue.global.async { dispatchWorkItem?.cancel() } presentingViewController?.dismissViewController(animated: true, completion: nil)