2011-12-16 12 views
3

私はコアデータで新しく、正しい方法で何かを行う方法についていくつか質問があります。私は一時的なエンティティを扱うためには、ユーザーが新しいエンティティを編集している間は、temporaryManagedObjectContextが必要だと思います。ユーザーがそのデータをタップすると、それらのエンティティをpersistedManagecObjectContextに挿入してからsaveContextに挿入します。これを達成するベストプラクティスは何ですか?私はテンポラリコンテキストで保存したくないので、スレッドを使用することは必須ですか?コアデータと管理オブジェクトのコンテキスト

あなたの知識をお寄せいただきありがとうございます。

+0

私は完全な答えを書く時間がありませんでしたが、ここで説明されているようにマルチコンテキストのコア日付を試してみることができます。http://www.cocoanetics.com/2012/07/multi-context-coredata/ – Abizern

答えて

6

一時的なManagedObjectContext(MOC)の変更を永続化されたものにマージする必要があります。これは私がこれを達成した例です。 私はスレッディング(スレッドごとに1つのMOC)を使用していますが、実際にはスレッドがなくてもうまくいくはずです。

あなたはtempMOCで変更を保存するには、このメソッドを呼び出します。

- (void) saveNewEntry { 
    NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; 

    // Subscribe to "NSManagedObjectContextDidSaveNotification" 
    // ..which is sent when "[tempMOC save];" is called. 
    [dnc addObserver: self 
      selector: @selector(mergeChanges:) 
       name: NSManagedObjectContextDidSaveNotification 
       object: tempMOC]; 

    // Save changes 
    [tempMOC save]; 

    // Remove subscribtion 
    [dnc removeObserver: self 
        name: NSManagedObjectContextDidSaveNotification 
       object: tempMOC]; 

} 

...への通知をオフに解雇れる:

- (void) mergeChanges: (NSNotification*) saveNotification { 

    // If youre using threads, this is necessary: 
    [self performSelectorOnMainThread: @selector(mergeToMainContext:) 
          withObject: saveNotification 
         waitUntilDone: NO]; 

    // ...otherwise, you could do the merge in this method 
    // [persistedMOC mergeChangesFromContextDidSaveNotification: saveNotification]; 
} 

...順番に呼び出す:

- (void) mergeToMainContext: (NSNotification*) saveNotification { 

    [persistedMOC mergeChangesFromContextDidSaveNotification: saveNotification]; 

} 
+0

作品!ありがとうございました。 – Samui

+0

ようこそ。私はそれを進めています。 –

+0

これは私が持っていた大きな問題を解決しました - ありがとう! – Slee

0

私は同じ問題を抱えています(エディタにはオブジェクトが必要なので作成しますが、キャンセルするとそのオブジェクトを破棄します)。しかし、私はすべての複数のオブジェクトのコンテキストとマージを避けるために、さらに強力なアプローチをとった。

私はすべてのオブジェクトに「is temp」フィールドを使用する。私は "暫定"オブジェクトを作成する必要があるとき、私は通常のようにオブジェクトを作成するメソッドを持っている私のデータ層では、しかし、isTempを反転させる前に= trueを返します。私の "オブジェクトエディタ" で次に

、onCancelがあります:

if (obj.isTemp) { 
    [context deleteObject: ... ]; 
} 

のOnSaveは次のとおりです。

if (obj.isTemp) obj.isTemp = NO; 
[context saveAsUsual...]; 

注:ここでは扱われていないに "捨てる" の変更をコピーしていないという問題がありますユーザーが保存を確認するまで既存のオブジェクト。それ以外の場合は、他のコードが共有コンテキストを保存したときに適用されるのを待っているトロイの木馬のような変更がそこにあります。

関連する問題