/* Page prose (de) */
"ProducingWithAsyncStream" = "# Eine Sequenz mit AsyncStream erzeugen\n\nKonsumieren ist nur die halbe Geschichte. Meistens bist *du* derjenige, bei dem Werte hereintröpfeln (von einem Timer, einem Standort-Callback, einem Bluetooth-Sensor), und du willst sie an eine `for await`-Schleife übergeben. **`AsyncStream` ist das Werkzeug, das eine Quelle einzeln eintreffender Werte in eine async Sequenz verwandelt.**\n\nDu erzeugst ihn mit einer Closure, die eine **Continuation** erhält, ein Objekt, das du aufrufst, um Werte in den Stream zu schieben:\n\n* `continuation.yield(value)` sendet ein Element an denjenigen, der iteriert.\n* `continuation.finish()` beendet den Stream, sodass die Schleife des Konsumenten stoppt.\n\nVerdrahten wir die Wetterstation auf dem Dach. Sie sendet ungefähr alle 0,3 Sekunden einen Messwert, fünfmal, und beendet dann.";
"ProducingWithAsyncStream-2" = "**Sieh es laufen:** die beiden `print`-Zeilen verschränken sich, paarweise, ungefähr alle 0,3 Sekunden: `sensor emits reading 1`, dann `received ...°C`, dann eine Pause, dann Messwert 2, und so weiter. Nach dem fünften Messwert beendet `finish()` den Stream, die Schleife verlässt sich, und `Stream finished` wird ausgegeben. Du siehst buchstäblich, wie Werte im Lauf der Zeit eintreffen, etwas, das dir kein simples Array zeigen könnte.\n\n* callout(Probier es aus): Ändere `1...5` in `1...8` und die Verzögerung in `.milliseconds(150)`. Der Stream sendet nun mehr Messwerte, schneller. Die Zeile `finish()` beendet ihn immer noch sauber.\n\nEin paar Dinge, die es wert sind, benannt zu werden:\n\n* Die Closure führt ihre eigene `Task` aus, um das Warten zu erledigen. `yield` kann von überall aufgerufen werden, beliebig oft: von einem Timer, einer Delegate-Methode, einem Completion Handler. Jeder Aufruf liefert ein Element an die Schleife.\n* Wenn noch niemand auf den nächsten Wert gewartet hat, **puffert** `AsyncStream` ihn, sodass du keinen Messwert verlierst, der eintrifft, während der Konsument beschäftigt ist.\n* Die Werte, die du mit `yield` sendest, sollten **`Sendable`** sein: sie springen von der erzeugenden Aufgabe zur konsumierenden. `Double` und `Int` sind es bereits, also bleibt die Data-Race-Prüfung von Swift 6 hier still.\n\n[Zurück](@previous)  |  Seite 3 von 7  |  [Weiter: Aufräumen mit onTermination](@next)";
