web-dev-qa-db-ja.com

DispatchQueueの使用中に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")
    }
}

メインスレッドからこのスレッドの実行を停止する必要があります。どうすれば可能ですか

5
Krishnakumar CN

最善の解決策は、DispatchWorkItemasyncを実行することだと思います。

DispatchWorkItemは、実行可能な作業をカプセル化します。作業項目は、DispatchQueueおよび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()
}
_
14
Andrea Mugnaini

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 に関する詳細情報

1
Horatiu