/* Page prose (de) */
"VersionAClassic" = "# Version A (klassisch): GCD + Completion Handler + `DispatchGroup`\n\nJeder Abruf nimmt einen **Completion Handler**, eine Closure, die er mit einem\n`Result` zurückruft, wenn das (simulierte) Netzwerk fertig ist. Weil die beiden\nAbrufe unabhängig sind, schieben wir beide auf Hintergrund-Warteschlangen und\nverwenden eine **`DispatchGroup`**, um zu erfahren, wann *beide* zurückgerufen\nhaben. Dann springen wir zum Hauptthread, um zu kombinieren und zu berichten.";
"VersionAClassic-2" = "**Sieh es laufen:** `Fetching menu and stock...` wird zuerst ausgegeben: beide\n`fetch`-Aufrufe kehrten sofort zurück. Die beiden Abrufe laufen parallel (0,6 s\nund 0,4 s), also leert sich die Gruppe etwa 0,6 Sekunden später und du bekommst,\nauf dem Hauptthread:\n\n* callout(Ausgabe):\n`Fetching menu and stock...`  \n`Sellable today: [\"Latte\", \"Espresso\"]`\n\nCold Brew wird herausgefiltert, weil sein Bestand `0` ist.\n\n* callout(Probier es aus): Ändere den Bestand von Cold Brew in `fetchStock` von\n`0` auf `2`. Taucht es jetzt in der Liste der verkäuflichen Getränke auf?\n\nZähle nun, was dich das gekostet hat:\n\n* Zwei veränderliche `Result?`-Variablen, die außerhalb der Closures leben, um\njede Antwort aus ihrem Completion Handler herauszuschmuggeln.\n* Manuelle `enter()`/`leave()`-Buchführung: ein Ausrutscher und die Gruppe hängt\noder stürzt ab.\n* Das Ergebnis sind zwei **optionale** `Result`s am Verbindungspunkt, also\nbrauchst du ein `guard` *und* ein `do`-`try`-`catch`, um von \"zwei `Result?`s\"\nzu \"zwei echten Werten oder einem Fehler\" zu kommen.\n* Der Sprung auf den Hauptthread ist etwas, an das *du* dich erinnern musstest\n(`notify(queue: .main)`). Vergiss ihn und du würdest auf einem Hintergrundthread\nkombinieren und die UI von dort aktualisieren, ein Bug, den der Compiler nie\nerwähnt.\n\nNichts davon ist falsch. Aber jedes Stück ist manuell, und die eigentliche\nLogik, \"das Menü nach dem Bestand filtern\", ist in Zeremonie vergraben.\n\n* callout(Am Rande zum Data Race): `menuResult` und `stockResult` werden von\nHintergrundthreads geschrieben und in `notify` gelesen. Das ist zufällig sicher,\nweil die `leave()` → `notify`-Reihenfolge der Gruppe garantiert, dass die\nSchreibvorgänge vor dem Lesen abgeschlossen sind, aber *nichts prüft das für\ndich*. Genau das ist die Art von Gefahr, die Data Races im Allgemeinen\nverursachen, und genau das, was das moderne Modell konstruktiv beseitigt.\n\n[Zurück](@previous)  |  Seite 3 von 8  |  [Weiter: Version B: Die moderne Art](@next)";
