web-dev-qa-db-fra.com

Comment arrêter l'exécution d'un thread d'arrière-plan en cours d'exécution à partir du thread principal sur Swift lorsque vous utilisez 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")
    }
}

Je dois arrêter d'exécuter ce fil à partir du fil principal. Comment est-ce possible

5
Krishnakumar CN

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()
}
11
Andrea Mugnaini

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

1
Horatiu