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")
}
}
Je dois arrêter d'exécuter ce fil à partir du fil principal. Comment est-ce possible
Je pense que la meilleure solution consiste à exécuter DispatchWorkItem
dans async
:
DispatchWorkItem encapsule le travail pouvant être effectué. Un élément de travail peut être distribué sur une DispatchQueue et dans un DispatchGroup
à la fin, votre code pourrait être:
let workItem = DispatchWorkItem {
//.... writing stuff in background ....
DispatchQueue.main.async {
//.... done writing stuff, updating ui ....
}
}
DispatchQueue.global().async(execute: workItem)
lorsque vous devez arrêter l'exécution, appelez simplement .cancel()
:
//.... but, if stuff goes wrong ....
DispatchQueue.main.async {
workItem.cancel()
}
Vous pouvez utiliser un 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)
Et à un moment donné de votre thread principal, vous pouvez annuler l'opération:
blockOperation.cancel()
Plus d'infos sur BlockOperation
Plus d'infos sur OperationQueue