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")
}
}
メインスレッドからこのスレッドの実行を停止する必要があります。どうすれば可能ですか
最善の解決策は、DispatchWorkItem
でasync
を実行することだと思います。
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()
}
_
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 に関する詳細情報