スウィフト3では、DispatchQueue
が1つのタスクを完了したときに完了ハンドラが不要です。 さらに、さまざまな方法で目標を達成することができます
これは一方的です。
var a: Int?
let queue = DispatchQueue(label: "com.app.queue")
queue.sync {
for i in 0..<10 {
print("Ⓜ️" , i)
a = i
}
}
print("After Queue \(a)")
ループが終了するまで待機しますが、この場合はメールスレッドがブロックされます。
また、この
let myGroup = DispatchGroup()
myGroup.enter()
//// Do your task
myGroup.leave() //// When your task completes
myGroup.notify(queue: DispatchQueue.main) {
////// do your remaining work
}
最後に一つのように同じことを行うことができます。 DispatchQueueを使用してタスクが完了したときにcompletionHandlerを使用する場合は、DispatchWorkItem
を使用できます。ここで
は、あなたが、これはデッドロックが発生します、メインキューにこれを呼び出すと仮定DispatchWorkItem
let workItem = DispatchWorkItem {
// Do something
}
let queue = DispatchQueue.global()
queue.async {
workItem.perform()
}
workItem.notify(queue: DispatchQueue.main) {
// Here you can notify you Main thread
}
別のクラスの関数を実行したいが、その関数を終了するのを待ってから、現在のクラスの中でどのように処理することができるのか? –
@SaeedRahmatolahi: 'wait'アプローチを使用するか(ブロックするのが問題ない場合、つまりメインスレッドにない場合)、または補完ハンドラを提供するか、呼び出しクラスでnotifyアプローチを使用します。 – shallowThought
非同期ブロックの外側で 'group.enter'をなぜ呼び出すのですか?グループに入ったり出たりするのは各ブロックの責任ではないでしょうか? – Bill