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)