/* Page prose (de) */
"WaitBlockingAlternative" = "# `wait()`: die blockierende Alternative\n\n`notify` gibt dir einen Callback. Manchmal willst du stattdessen genau hier **anhalten und warten**, bis die Gruppe leer ist. Das ist `wait()`, unten gezeigt.";
"WaitBlockingAlternative-2" = "**Sieh es laufen:** Die drei `Finished:`-Zeilen werden ausgegeben (in beliebiger Reihenfolge), und erst dann wird `All prep done` ausgegeben. Beachte, dass du hier **kein** `needsIndefiniteExecution` gebraucht hast: `wait()` blockiert den Top-Level-Code, bis die Arbeit fertig ist, also kann die Seite nicht zu früh enden.\n\nDiese Bequemlichkeit verbirgt eine Falle. **`wait()` blockiert den Thread, der es aufruft.** Im Top-Level-Code eines Playgrounds ist dieser Thread der Hauptthread, und ihn hier zu blockieren ist harmlos, weil ihn nichts anderes braucht. **In einer echten App friert der Aufruf von `wait()` auf dem Hauptthread die UI ein**, und zwar für die gesamte Dauer, genau die Art von Einfrieren, vor der dich ein früheres Kapitel gewarnt hat. Die Lösung ist eines von zwei Dingen:\n\n* Bevorzuge `notify(queue:)`: Es blockiert nicht, also friert nichts ein.\n* Wenn du wirklich blockieren musst, warte **auf einer Hintergrund-Warteschlange**, niemals auf dem Hauptthread:\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\nDu kannst auch ein Timeout übergeben: `group.wait(timeout: .now() + 2)` gibt `.timedOut` zurück, statt für immer zu warten, was eine gute Gewohnheit ist, damit eine feststeckende Aufgabe dich nicht unbegrenzt aufhängen kann.\n\n[Zurück](@previous)  |  Seite 4 von 8  |  [Weiter: Der klassische Fehler: unausgeglichenes enter/leave](@next)";
