2013-02-22 12 views
6

私のアプリでは、私はUITableViewControllerにイベントリストを表示しています。このコントローラーは、ManagedObjectContext Say ParentContextを使用します。イベントが選択されると、イベントの詳細を編集できる詳細なView Controllerが表示されます。 コアデータ複数レベル親 - 子コンテキスト

NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    childContext.parentContext = self.context ; 

が今再びダウンし、別のドリルを必要とするいくつかのフィールドと関係があります。だから私は

ChildContext with type "NSPrivateQueueConcurrencyType"

ChildContext whose parent Context is "ParentContext".

私のコードがあり、子コンテキストが言う作成しました。だから私は、新しいビューコントローラの別のChildContextを作成している、

GrandChildContext with type "NSPrivateQueueConcurrencyType"

GrandChildContext whose parent context is "ChildContext"

このプロセスは別のレベル(子の親(のtableView)から合計4レベル)

self.context - Parent Context 
    | 
    | 
ChildContext 
    | 
    | 
GrandChildContext 
    | 
    | 
GrandGrandChildContext 
のために行くと言います

My Entityはこのようになります

EntityA   -- (Edit View Controller - uses ChildContext) 
| 
|- Field1 
| 
|- Field2 
| 
|- RelationShip (1 to Many) - (Relationship Add/Edit View Controller - uses GrandChildContext) 
    | 
    |- Field1 
    | . 
    | . 
    |- Field3 
    | 
    |- Relationship (1 to Many) - (Relationship Add/Edit View Controller - uses GrandGrandChildContext) 
      | 
      |- Field1 
      | 
      |- Field2 

これはParent - Childコンテキストを使用する正しい方法ですか?ある時点で、私は1 NSMainQueueConcurrencyType MOC and 3 NSPrivateQueueConcurrencyType MOCのようになります。

そうでない場合は、それ以外の方法はありますか?

子のコンテキストが多すぎると、アプリケーションのパフォーマンスに影響しますか?

当初、私は、ユーザーを管理するためのプロパティとNSArraysを使用するには、データを入力し、ユーザが完了ボタンを押したとき、私は、管理対象オブジェクトを作成/更新します。しかし、これは退屈な仕事で、私のView Controllerを汚いものにしました。だから私は非常に保存/更新を破棄するのは簡単です親子のコンテキストに切り替えました。

おかげ

答えて

4

あなたは多少の子供の文脈で少し外に出てしまったかもしれませんが、ほんの少しで、あなたの一般的なアプローチは健全です。 MOC(管理オブジェクトコンテキスト)はかなり軽量のオブジェクトです。

私は、それぞれのビューコントローラ/シーン内で、そのシーンに適用されるMOCへの明確な参照を持たせることをお勧めします。

MOCについてセッションやスクラッチパッドと考えるのが役立つことがあります。マッチアップはMOCとエンティティの間ではなく、むしろMOCと論理作業単位の間で行われます。

ドリルダウンの1つが、ユーザーが放棄/キャンセルしたい編集作業の開始を示している場合は、子MOCをスピンオフして新しいビューに渡すのが良い瞬間です。必要に応じて、ロールバックすることができます。また、MOCを放棄するだけで、開始点まで巻き戻すことができます。

一方、静的情報のためのビューアを作成する場合は、MOCを1つだけ使用します。その場合、より多くのものを使用する必要はありません。

+3

すべてのドリルダウンでは編集作業があります。私はちょうどドリルダウンのいくつかの保存/キャンセル操作を削減することができた。このモデルでしばらく作業した後、私が見つけた唯一の問題は、作成された関係が親の子では見えないことです。これは、ios 5でのみ発生します。これは既知のバグです。子コンテキストを保存する直前にobtainPermanentIDsを呼び出すことで修正しました。 – krishnan

+0

このコメントを見つけて、obtainPermanentIDs呼び出しを追加しようとすると、私の神、+ krishnan、 –

-1

おそらくネストされた管理対象オブジェクトコンテキストのための最高のユースケースについての混乱のわずかな量があります。あなたの場合、私は単一の文脈を使うことをお勧めします。

アレイなどからコアデータに移動することは非常に良いアイデアでした。今、オブジェクトグラフの真のパワーとシンプルさを引き出します。物事を単純にするようにしてください。

ドリルダウンするには、コンテキストを子ビューコントローラに渡します。子ビューコントローラがフェッチした結果コントローラは、親ビューコントローラと同じコンテキストを使用できます。数多くのAppleのコード例では、このパターンを正確に使用しています。

コンテキストが必要なのは、同時性が本当に必要な場合だけです。これはまったく当てはまらないようです。データが取得されると、子ビューコントローラの新しいインターフェイスが表示されます。それが時間がかかりすぎると(データがWebサービスから来るため)、データ取得が完了したら、何らかの種類の「しばらくお待ちください」インターフェースを表示し、完全なインターフェースを表示します。おそらくこれはあなたのシナリオではないでしょう。

+5

[link](https://developer.apple.com/videos/wwdc/2012/)wwdc 2012のビデオコアデータのベストプラクティスセッション214を参照すると、親と子のコンテキストを使用して詳細を表示する方法が示されていますビューコントローラ。私は同じテクニックを使用しているので、ユーザーが保存ボタンを押すと子コンテキストを保存でき、子コンテキストのすべての変更が親コンテキストにプッシュされます。ユーザーがキャンセルボタンを押すと、私は単にView Controllerを終了し、すべての変更が失われます。ここでは、すべての子ビューコントローラは、データを編集する詳細インスペクタであるため、取得された結果コントローラはありません。 – krishnan

+0

'[context save:nil];の代わりに、' [context rollback];を使って、ただ一つのコンテキストで同じ結果を得ることができます。 WWDCビデオは、ディテールビューコントローラのフェッチに過度の時間がかかる場合に便利です。 – Mundi

+0

私はあなたが私の質問を理解していないと思う。私の質問はこの[1](http://stackoverflow.com/questions/10443754/undo-all-changes-made-in-the-child-view-controller)に似ています。しかし、私の場合、私は複数レベルの子のコンテキストを持っています。 '[コンテキストロールバック]'で、私の変更はすべて失われます。しかし、代わりに私はいくつかの変更を破棄したいだけです。すぐにサンプルプロジェクトをアップロードします。ありがとう – krishnan

関連する問題