/* Page prose (de) */
"TakingOverTheStateMachine" = "# Die Zustandsmaschine selbst übernehmen\n\nEine `Operation` bewegt sich durch eine kleine **Zustandsmaschine**: `ready` → `executing` → `finished`.\n\n* **ready**: Abhängigkeiten erfüllt, wartet, bis sie an der Reihe ist.\n* **executing**: läuft gerade.\n* **finished**: fertig (ob abgeschlossen oder abgebrochen).\n\nFür eine normale Operation treibt Foundation diese Übergänge für dich an und wechselt zu **finished**, sobald `main()` zurückkehrt. Für Callback-basierte Arbeit musst du die Operation in **executing** halten, bis der Callback feuert, also musst du die Übergänge selbst antreiben.\n\nFoundation beobachtet drei schreibgeschützte Eigenschaften (`isReady`, `isExecuting`, `isFinished`) mit **KVO** (Key-Value Observing), dem Objective-C-Mechanismus, bei dem ein Objekt ankündigt \"diese Eigenschaft wird sich gleich ändern / hat sich gerade geändert\", damit Beobachter reagieren können. Eine `OperationQueue` beobachtet `isFinished`; so erfährt sie, dass eine Operation fertig ist, und kann die nächste abhängige starten. Wenn du diese Zustände also von Hand umschaltest, musst du **die KVO-Benachrichtigungen auslösen** (`willChangeValue(forKey:)` davor, `didChangeValue(forKey:)` danach), oder die Warteschlange erfährt es nie.\n\nEs gibt noch ein Teil mehr. Du überschreibst `isAsynchronous`, sodass es `true` zurückgibt. Das ist dein Versprechen an Foundation: *\"Nimm nicht an, dass ich fertig bin, wenn `start()` zurückkehrt; beobachte `isFinished`, ich schalte es selbst um.\"* Hier ist eine kleine, wiederverwendbare Basisklasse, die genau das tut:";
"TakingOverTheStateMachine-2" = "Lies `start()` genau. Wenn die Operation abgebrochen wurde, bevor sie begann, gehen wir direkt zu **finished**, ohne `main()` auszuführen. Andernfalls wechseln wir zu **executing** und rufen `main()` auf, aber wir *beenden* hier nicht. Die Operation bleibt in **executing**, bis jemand `finish()` aufruft, was sie zu **finished** bewegt und die KVO-Benachrichtigung auslöst, auf die die Warteschlange wartet.\n\nJetzt wird der Upload korrekt. Eine Subklasse überschreibt `main()`, startet die asynchrone Arbeit und ruft `finish()` aus dem Callback auf:";
"TakingOverTheStateMachine-3" = "**Sieh es laufen:** Jetzt ist die Reihenfolge `⬆️ Uploading...`, dann eine Sekunde später `✅ ... reached the print server`, und *erst dann* `🎉 completionBlock`. Die Operation blieb die ganze Sekunde in **executing**, genau wie es sein soll. Hätte dieser Upload eine abhängige Operation, würde sie jetzt auf die echte Fertigstellung warten, nicht auf die verfrühte.\n\n* callout(Probier es aus): Kommentiere die `self.finish()`-Aufrufe im Callback aus und führe aus: Die Zeile `🎉 completionBlock` erscheint nie, weil die Operation **executing** nie verlässt.\n\n> **Die eine Regel, die du nicht brechen darfst:** Eine asynchrone Operation muss *immer* **finished** erreichen, auf jedem Pfad: Erfolg *und* Abbruch. Deshalb ruft der Abbruchzweig oben ebenfalls `finish()` auf. Vergiss es, und die Operation bleibt für immer in **executing** stecken und verstopft die Warteschlange dahinter wie ein Papierstau, der sich nie löst.\n\n[Zurück](@previous)  |  Seite 5 von 7  |  [Weiter: completionBlock, kurz](@next)";
