如何在使用DispatchQueue时,由主线程停止正在运行的后台线程执行?

11
 DispatchQueue.global(qos: .background).async {
    //This will run on the background queue
    self.writeValue(tag: GlobalData.WRITE_DATA, data: getDataForWrite(1) )
    self.writeValue(tag: GlobalData.WRITE_DATA, data: getDataForWrite(2) )
    self.writeValue(tag: GlobalData.WRITE_DATA, data: getDataForWrite(3) )
    self.writeValue(tag: GlobalData.WRITE_DATA, data: getDataForWrite(4) )
    self.writeValue(tag: GlobalData.WRITE_DATA, data: getDataForWrite(5) )
    // .....
    DispatchQueue.main.async {
        //This will run on the main queue, after the previous code in outer block
        print("done writing data")
    }
}

我需要停止从主线程执行此线程。这有可能吗?


1
对我来说,你想要什么还不清楚。 - meaning-matters
1
这段代码将异步运行,直到所有语句都执行完毕。但是如果我的主线程出现任何问题,我需要在其中停止该线程。我该如何使用主线程的某个命令在其中间终止该线程? - krishnakumarcn
2个回答

23

我认为最好的解决方法是在async中执行DispatchWorkItem

DispatchWorkItem封装了可以执行的任务。工作项可以分派到DispatchQueueDispatchGroup中。

因此,最终您的代码可能是:

let workItem = DispatchWorkItem {
   //.... writing stuff in background ....

   DispatchQueue.main.async {
      //.... done writing stuff, updating ui ....
   }
}
DispatchQueue.global().async(execute: workItem)

当你需要停止执行时,只需调用.cancel()

//.... but, if stuff goes wrong ....
DispatchQueue.main.async {
   workItem.cancel()
}

1
请记住,取消工作项不会取消已经执行的工作项。- https://developer.apple.com/documentation/dispatch/dispatchworkitem/1780910-cancel - Kai

1
你可以使用BlockOperation。
let blockOperation = BlockOperation {
    self.writeValue(tag: GlobalData.WRITE_DATA, data: getDataForWrite(1) )
    self.writeValue(tag: GlobalData.WRITE_DATA, data: getDataForWrite(2) )
    self.writeValue(tag: GlobalData.WRITE_DATA, data: getDataForWrite(3) )
    self.writeValue(tag: GlobalData.WRITE_DATA, data: getDataForWrite(4) )
    self.writeValue(tag: GlobalData.WRITE_DATA, data: getDataForWrite(5) )
    //...
}

let queue = OperationQueue()
queue.addOperation(blockOperation)

在主线程中的某个时间点,您可以取消该操作:

blockOperation.cancel()

BlockOperation的更多信息

OperationQueue的更多信息


如果我想在后台队列中运行上述操作怎么办? - Shyam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接