我使用以下代码从新启动的视图控制器执行一些复杂的后台操作
let globalQueue = DispatchQueue.global()
globalQueue.async {
//complex job
}
当用户点击取消按钮时,我会调用
self.dismissViewController(self)
但似乎这并不能阻止后台任务。
我该如何解决这个问题?
答案 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()
}
}