/* Page prose (ja) */
"WaitBlockingAlternative" = "# `wait()`: ブロックする代替手段\n\n`notify` はコールバックを渡してくれます。ときには代わりに、グループが空になるまでこの場で**止まって待ちたい**こともあります。それが `wait()` で、下に示します。";
"WaitBlockingAlternative-2" = "**実行して確認:** 三つの `Finished:` の行が（どんな順序でも）表示され、それからようやく `All prep done` が表示されます。ここでは `needsIndefiniteExecution` が**必要なかった**ことに注目してください。`wait()` はトップレベルのコードを作業が完了するまでブロックするので、ページが早く終わってしまうことはありません。\n\nその便利さには罠が隠れています。**`wait()` はそれを呼んだスレッドをブロックします。** Playground のトップレベルのコードでは、そのスレッドはメインスレッドであり、ここでブロックしても他に必要とするものがないので無害です。**実際のアプリでは、メインスレッド上で `wait()` を呼ぶと、その全期間にわたって UI が固まります**。これはまさに前の章が警告した種類のフリーズです。修正は次の二つのどちらかです。\n\n* `notify(queue:)` を優先しましょう。ブロックしないので、何も固まりません。\n* どうしてもブロックする必要があるなら、待機は**バックグラウンドキューで**行い、決してメインスレッドでは行わないようにしましょう。\n\n```swift\nDispatchQueue.global().async {\n    group.wait()                 // block a background thread, fine\n    DispatchQueue.main.async {\n        print(\"Batch complete: now update the UI\")\n    }\n}\n```\n\nタイムアウトを渡すこともできます。`group.wait(timeout: .now() + 2)` は、永遠に待つ代わりに `.timedOut` を返します。これは、詰まったタスクが無期限にあなたをハングさせないための良い習慣です。\n\n[前へ](@previous)  |  4 / 8 ページ  |  [次へ: 古典的なバグ: 不均衡な enter/leave](@next)";
