如何在使用DispatchQueue时停止在swift上从主线程执行正在运行的后台线程

Kri*_* CN 5 multithreading grand-central-dispatch ios swift

 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")
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要停止从主线程执行此线程.这怎么可能

And*_*ini 14

我认为最好的办法是执行DispatchWorkItemasync:

DispatchWorkItem封装了可以执行的工作.可以将工作项分派到DispatchQueue和DispatchGroup中

所以最后你的代码可能是:

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

   DispatchQueue.main.async {
      //.... done writing stuff, updating ui ....
   }
}
DispatchQueue.global().async(execute: workItem)
Run Code Online (Sandbox Code Playgroud)

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

//.... but, if stuff goes wrong ....
DispatchQueue.main.async {
   workItem.cancel()
}
Run Code Online (Sandbox Code Playgroud)

  • 我试过这个,但执行不停. (8认同)