/* Page prose (ja) */
"DispatchGroupFinishLine" = "# `DispatchGroup`: 多くのタスクのためのゴールライン\n\n**`DispatchGroup`** は一群のタスクを追跡するカウンターで、その集合全体が完了したときに通知を受け取れるようにします。タスクがグループに参加したことを `enter()` で記録し、終了したことを `leave()` で記録します。`leave()` の呼び出し回数が `enter()` の呼び出し回数に追いついたとき（グループが**空**になったとき）、グループが発火します。";
"DispatchGroupFinishLine-2" = "`notify(queue:)` が鍵となる行です。指定したキュー上で、グループが空になった瞬間に**あとで**実行するブロックを登録します。これは**ブロックしません**。コードはそのまま先へ流れていきます。\n\n**実行して確認:** 注目すべき点が二つあります。第一に、`📤 Batch sent...` がどのドリンクよりも先に表示されます。`notify` はブロックしませんでした。第二に、ドリンクは**完了順**に現れます（コールドブリュー、次にエスプレッソ、次にラテ）。開始した順序では*なく*、まさに前の章のレッスンどおりです。しかしトレイの行は必ず**最後**に、三つすべての後に来ます。グループがすべての `leave()` を待ったからです。それこそが肝心な点です。タスクがどんな順序で終わろうと、きれいな「すべて完了」のコールバックが一つだけ得られます。\n\n* callout(試してみよう): 抽出時間を入れ替えて、ラテを `0.1`、コールドブリューを `0.9` にしてみましょう。ドリンクは並び替わりますが、トレイの行はそれでも最後に来ますか。\n\n> 作業が単純な `async` クロージャのときは、手動のペアを省いて、キューに代わりにバランスを取らせることができます。`barista.async(group: group) { ... }` です。これはブロックの前に `enter()` を、後に `leave()` を呼ぶ**ショートカット**です。「完了」の瞬間があとで発火する*コールバック*（ネットワークの completion handler のように）で、終わりが「終了」を意味する単一のクロージャが存在しない場合には、手動の `enter()`/`leave()` を使いましょう。\n\n[前へ](@previous)  |  3 / 8 ページ  |  [次へ: wait(): ブロックする代替手段](@next)";
