ディスパッチキュー、非同期タスクなどについては既に多くの記事がありますが、余分なコードのために気を散らしすぎるため、これらの投稿から有用な説明を取り出すことはできません。タスクAが終了した後にタスクBを開始する方法について私に明確な指示を与えることができる人がいますか?ディスパッチキューのクリアの説明
タスクBを正常に実行するためにタスクAからのデータが必要ですが、私はDispatchQueue.asyncで何かをしなければならないことを知っていますが、正確には分かりません。
ディスパッチキュー、非同期タスクなどについては既に多くの記事がありますが、余分なコードのために気を散らしすぎるため、これらの投稿から有用な説明を取り出すことはできません。タスクAが終了した後にタスクBを開始する方法について私に明確な指示を与えることができる人がいますか?ディスパッチキューのクリアの説明
タスクBを正常に実行するためにタスクAからのデータが必要ですが、私はDispatchQueue.asyncで何かをしなければならないことを知っていますが、正確には分かりません。
どうやってこのようなことができますか?
import Dispatch
let queue = DispatchQueue(label: "My dispatch queue") //TODO: Give better label
let result1 = queue.sync { // "Task A"
return "result 1"
}
let result2 = queue.sync { // "Task B", which uses result from Task A
return result1.uppercased()
}
print(result2)
典型的なプロセスは、いくつかのシリアルキューにasync
と非同期的に派遣するだろう。それでは、あなたは、画像を処理タスクAをやって、その後、タスクBのためにいくつかのキューをしたいとしましょう、その後、タスクBが実行されたときに、いくつかのUIの更新を行う、あなたが行う可能性があります:
let queue = DispatchQueue(label: Bundle.main.bundleIdentifier! + ".images")
queue.async {
// do task A
}
queue.async {
// do task B
}
queue.async {
// do whatever else is needed after B here
DispatchQueue.main.async {
// update model objects and UI here
}
}
これは、ブロッキングを回避パターンですメインのキューを使用しますが、AとBを連続して実行するようにします。
タスクAまたはタスクBのいずれかが非同期の場合、上記は機能しませんのでご注意ください。 (基礎となるタスクが非同期の場合はsync
を使用しようとしませんでした。)これらの場合、他のパターンも適用されます。しかし、あなたの例はあまりにも一般的であり、単純にあまりにも多くのパターンがあり、それらをすべて列挙することはできません。 AとBがどのような仕事をしているのかを具体的に教えていただければ、より建設的な弁護士を提供することができます。
また、私は、(sync
で)同期的にディスパッチすることを明示的に助言しています。 sync
を使用すると特定の直感的な魅力がありますが、まれに正しいアプローチです。呼び出し側のスレッド(これはsync
)をブロックすることは、まず最初にディスパッチキューを持つ目的を無効にします。 sync
を(ほとんど)唯一の理由として使用する必要があるのは、共有リソースへのスレッドセーフなアクセスを試みる場合です。しかし、ほとんどの場合、ディスパッチキューは現在のスレッドから時間を費やすタスクを得るために明示的に使用します。だから、AとBをasync
をシリアル待ち行列に送り、その後何か別のCを実行したいなら、async
を同じ待ち行列に送ります。
説明はConcurrency Programming Guide: Dispatch Queuesを参照してください。例はObjective-Cですが、すべての概念は同じです。また、WWDC videosに行き、 "GCD"を検索すると、Grand Central Dispatch(ディスパッチキューテクノロジの広義語)を歩く素晴らしいビデオがいくつも得られます。
「タスクBはタスクAの後に開始します。つまり、シリアルDispatchQueueが必要です(これがデフォルトです)。 AとBが終了するのを待つか、非同期にディスパッチさせたいのですか?プログラムが終了するのを待たずにプログラムを再開させますか? – Alexander
@Alexanderはい、それは私が必要とするものです。タスクAとBが他のすべてのコーディングに必要なすべてのデータを集めるので、他のコードがタスクAとBを待つようにします。 –
それで、あなたは非同期的に( '.sync')非同期的に(' .sync')仕事を提出したいです。 – Alexander