/* Page prose (ja) */
"WrappingUp" = "# まとめ\n\n依存関係は、正しい順序と、Operation 間での競合のないデータの受け渡しをもたらしてくれます。手作業の帳簿づけが積み上がるのは、キャンセルとコールバック駆動の作業のところです。下に挙げる落とし穴のほとんどは、自分の手で覚えておかなければならない手順です。キャンセルフラグを確認する、すべての経路で **finished** に到達する、キャンセルされた依存関係に備える。覚えることがどれほど多いかに注目してください。というのも、その帳簿づけこそ、モダンな Swift の並行処理が*まさに*自動化してくれるものであり、モダンモデルは、あなたがついにそれを手放せる場所だからです。\n\n* `addDependency(_:)` は順序を強制します。依存する側は、すべての依存関係が `isFinished` を報告するまで始まりませんが、それは作業を順序づけるだけで、データを運びはしません。出力は自分で前へ配線し、使う前に**キャンセルされた依存関係**（それでも「終了」しており、出力が `nil` の場合もあります）に備えましょう。\n* 依存関係は 2 つの Operation を時間的に完全に分離するので、一方から次へデータを渡すのは競合がありません。依存関係は一方向に流れるように保ちましょう。循環があると、両方の Operation が永遠に *ready* にならないままになります。\n* キャンセルは**協調的**です。`cancel()` は `isCancelled` を設定するだけです。`main()` は、遅いステップの前やループの内側でフラグを確認し、早めに戻らなければなりません。さもないと何も止まりません。\n* ふつうの `Operation` は `main()` が戻った瞬間に「終了」します。あとのコールバックで完了する作業にとっては、これは間違いです。\n* **非同期の Operation** は `isAsynchronous` をオーバーライドし、`ready → executing → finished` のステートマシンを手作業で動かし、キューが気づくように KVO の通知を発火します。キャンセルを含むすべての経路で **finished** に到達しなければならず、さもないとキューはその後ろで止まってしまいます。そして、コールバックでは `[weak self]` をキャプチャしましょう。\n* `completionBlock` は、Operation が終了したら、どこかのスレッドで、キャンセルされた Operation に対してさえ実行されます。\n\n---\n\n## 次は\n\n次の章、[なぜモダンな並行処理か](Why%20Modern%20Concurrency.playgroundchapter/Overview)は、なぜモダンな並行処理が存在するのかを示します。コールバックの問題があらわになり、あなたがたった今すべて手作業で組み立てたものについて、構造化された並行処理が何を解決してくれるのかを見ていきます。\n\n[前へ](@previous)  |  7 / 7 ページ";
