解除View Controller不停止异步任务

时间:2017-10-24 07:04:40

标签: swift macos swift3

我使用以下代码从新启动的视图控制器执行一些复杂的后台操作

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

当用户点击取消按钮时,我会调用

self.dismissViewController(self)

但似乎这并不能阻止后台任务。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

创建调度工作项。

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

现在将复杂的任务放在调度工作项中。

dispatchWorkItem = DispatchWorkItem {
//Some complex job
}

在默认全局队列上执行工作。

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

您可以了解viewController何时被解雇。

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

答案 1 :(得分:1)

没有可以取消正在运行的线程的API。相反,可以添加取消标记来检查处理响应。

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()
        }
      }