如何在使用 DispatchQueue 时从 swift 上的主线程停止执行 运行 后台线程
How to stop execution of a running background thread from main thread on swift while using DispatchQueue
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")
}
}
我需要停止从主线程执行这个线程。怎么可能
我认为最好的解决方案是在async
中执行DispatchWorkItem
:
DispatchWorkItem encapsulates work that can be performed. A work item can be dispatched onto a DispatchQueue and within a DispatchGroup
所以最后你的代码可能是:
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()
}
您可以使用 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()
的更多信息
的更多信息
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")
}
}
我需要停止从主线程执行这个线程。怎么可能
我认为最好的解决方案是在async
中执行DispatchWorkItem
:
DispatchWorkItem encapsulates work that can be performed. A work item can be dispatched onto a DispatchQueue and within a DispatchGroup
所以最后你的代码可能是:
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()
}
您可以使用 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()
的更多信息
的更多信息