/* Page prose (ja) */
"TakingOverTheStateMachine" = "# ステートマシンを自分で動かす\n\n`Operation` は、小さな**ステートマシン**の中を進みます。`ready` → `executing` → `finished` です。\n\n* **ready**: 依存関係が満たされ、順番を待っている。\n* **executing**: 現在実行中。\n* **finished**: 完了（正常に完了したか、キャンセルされたかを問わず）。\n\nふつうの Operation では、Foundation がこれらの遷移をあなたの代わりに動かし、`main()` が戻るとすぐに **finished** に切り替えます。コールバックベースの作業では、コールバックが発火するまで Operation を **executing** のままにしておく必要があるので、遷移を自分で動かさなければなりません。\n\nFoundation は 3 つの読み取り専用プロパティ（`isReady`、`isExecuting`、`isFinished`）を **KVO**（Key-Value Observing）を使って監視します。KVO は、オブジェクトが「このプロパティはまもなく変わる / たった今変わった」と知らせて、オブザーバが反応できるようにする Objective-C の仕組みです。`OperationQueue` は `isFinished` を監視します。そうやって Operation が完了したことを知り、次の依存している Operation を開始できるのです。ですから、これらの状態を手作業で切り替えるときは、**KVO の通知を発火**しなければなりません（前に `willChangeValue(forKey:)`、後に `didChangeValue(forKey:)`）。さもないとキューは決して気づきません。\n\nもう 1 つ部品があります。`isAsynchronous` をオーバーライドして `true` を返すようにします。それは Foundation への約束です。*「`start()` が戻ったからといって私が終了したと思い込まないでください。`isFinished` を監視してください。私が自分でそれを切り替えます」*。こちらが、まさにそれを行う、小さくて再利用できる基底クラスです。";
"TakingOverTheStateMachine-2" = "`start()` をよく読んでみましょう。Operation が始まる前にキャンセルされていたら、`main()` を実行せずにまっすぐ **finished** へ進みます。そうでなければ **executing** に移って `main()` を呼びますが、ここでは終了*しません*。Operation は、誰かが `finish()` を呼ぶまで **executing** のままです。`finish()` はそれを **finished** に移し、キューが待っている KVO の通知を発火します。\n\nこれでアップロードが正しくなります。サブクラスが `main()` をオーバーライドし、非同期の作業を開始して、コールバックから `finish()` を呼びます。";
"TakingOverTheStateMachine-3" = "**実行して確認:** 今度は順序が `⬆️ Uploading...`、続いて 1 秒後に `✅ ... reached the print server`、そして*そのあとにようやく* `🎉 completionBlock` です。Operation は、あるべきとおりに、その 1 秒間ずっと **executing** のままでした。もしこのアップロードに依存している Operation があったなら、今度は早すぎる完了ではなく、本当の完了を待つことになります。\n\n* callout(試してみよう): コールバックの中の `self.finish()` の呼び出しをコメントアウトして実行してみましょう。`🎉 completionBlock` の行は決して現れません。Operation が **executing** から決して離れないからです。\n\n> **破ってはいけない唯一のルール:** 非同期の Operation は、すべての経路で、成功*と*キャンセルの両方で、*必ず* **finished** に到達しなければなりません。だからこそ、上のキャンセルの分岐でも `finish()` を呼んでいるのです。それを忘れると、Operation は永遠に **executing** で立ち往生し、決して解消されない紙詰まりのように、その後ろでキューを詰まらせてしまいます。\n\n[前へ](@previous)  |  5 / 7 ページ  |  [次へ: completionBlock について簡単に](@next)";
