2016-10-06 3 views
0

NSManagedObjectContextのチェーンを使用して、ロールバック/キャンセルできるビューとアクションの階層を表しています。 これは一例です: のは、私は次のような構造を持っているとしましょう:親NSManagedObjectContextを使用しているときのワークフローを修正します

  • クライアントリスト(メインNSManagedObjectContext)
  • クライアントの詳細(DetailContext - 親= MainContext)
  • クライアント食料品(GroceryContext - 親= DetailContext )
  • 食料品のお支払い(PaymentContext - 親= GroceryContext)

この方法で、私は食料品paymenにナビゲートすることができます変更を行い、必要に応じてキャンセルします。他のすべてのレベルで同じことを行います。保存を実行するとレベルを上げると変更が移動します。これまでのところ、これは期待どおりに動作しています。私は理解して欲しい

は、次の操作を行うには良い方法です:

  • を開き、リスト上のクライアントを。
  • 食料品を開きます。
  • オープン食料品の支払いレコード
  • トランザクションを追加

事は、このトランザクションは、同様のバックエンドに保存され、ローカルメインコンテキストに保存する必要があること、である何があったので、私残りのワークフローでは、そのトランザクションが行われました。

私がやっていることは、トランザクションが行われた場合、一連のデリゲートがすべての親コンテキストであるルートレベルまで呼び出され、トランザクションを保存することです。しかし、私はそれを行うより良い方法があるのだろうかと思っています。トランザクションが完了しても、途中で行われた他の変更を取り消すことができます。しかし、これらすべてのコンテキストは、最終的なので、トランザクションのために保存されたコンテキストの更新されたオブジェクトを持つ必要があります。

クライアント - 食料品の実際の使用例には添付しないでください。これはコンテキストの階層レベルを説明するためのものです。これらすべてのネストされた子のコンテキストを使用して

おかげ

答えて

0

は、ほぼ確実に間違ったアプローチです。ほとんどの場合、主なスレッドの中で一つの主なコンテキストだけが必要ですが、完了して一緒に保存すると意味がある変更がたくさんある場合は、そのために一時的な子コンテキストを使用できます。子コンテキストを保存するとすぐに主コンテキストも保存してディスクに保存します。データベーストランザクションのように考えてください。

バックグラウンドプロセスからの変更がある場合は、プライベートな子コンテキストを作成するか、永続的なストアコーディネータを完全に分離したプライベートコンテキストを作成することができます。変更を手動で2番目のメインコンテキストにマージする必要がありますしかし、ケース。それにはmanagedObjectContextDidSaveNotification:を使用してください。

+0

私はあなたの提案を理解していますが、なぜそれが間違ったアプローチだと思いますか? 最初の画面で取り消すことができるネストされた一連の画面がある場合、たとえば:4つのコンテキストの「レイヤー」があり、次に4番目のコンテキストで1つの変更を行い、それを保存してから3番目それを保存しますが、2番目のコンテキストでは、ユーザーはトランザクション全体を取り消すことを決定します。私は、このようなUXのための良い解決策として親のコンテキストがチェーン化されているのを見ますか?この方法では、すべてのステップが確認されれば、永続化されることになります(これはUXが必要とするものです)。 – Wak

+0

https://developer.apple.com/reference/coredata/nsmanagedobjectcontext コーディネーターの代わりに親コンテキスト。このパターンには、次のような使用シナリオが多数あります。 2番目のスレッドまたはキューでバックグラウンド操作を実行する。 インスペクタウィンドウやビューなど、破棄可能な編集を管理する。 – Wak

+0

私はちょうどそのような複数のネストされたコンテキストを持つ不必要に複雑なアプローチのように思える。いずれの場合も、 'managedObjectContextDidSaveNotification:'通知を使用して、トランザクションの変更を他のすべてのコンテキストにマージします。各子供は親の貯蓄を監視し、その変更を引き出す必要があります。 – trapper

関連する問題