2012-08-08 3 views
6

childContextとparentContextは「NSMainQueueConcurrencyType」の両方ですネストされたNSManagedObjectContext保存し、オブジェクトID

[childContext performBlock:^(void) { 
    [childContext save:NULL]; 

    [parentContext performBlock:^(void) { 
    [parentContext save:NULL]; 
    // Why is objectID for the inserted NSManagedObject still a temporary one here? 
    }]; 
}]; 

質問:

  1. が、これは子供と親コンテキストの両方を
  2. がなぜされて保存するための正しい方法です保存した後、挿入されたNSManagedObjectのobjectIDはまだ一時的なものですか?

答えて

3

メインキューMOCを別のメインキューMOCの子として使用したいと思うことはまれですが、確かに私に質問してください。両方を持つ利点それらのNSMainQueueConcurrencyTypeですか?

また、これは既知のバグです(少なくとも何回か報告されています)。子コンテキストから挿入して保存すると、永続ストアに直接接続されているものだけがIDが変更されます。したがって、新しく挿入したアイテムを保存するときには、いくつかの選択肢があります。

  1. 保存する前に永続IDを取得してください。
  2. [moc refreshObject:object mergeChanges:NO]を呼び出し、すべての参照をnilに設定します。
  3. 獲得永続IDは、ほとんどの親は、それがデータベースにディップが必要ですので、私は#3を好む

を保存した後。あなたがそれをやるなら、それは親からそれらを得ることができます。

+1

あなたの答えに質問に答えるには:子MOCを一連の変更のための「ステージング領域」として作成し、原子的に保存または拒否できるようにします。 (つまり、ユーザーがキャンセルボタンをタップすると、保存せずにMOCを破棄するだけです)。 – benzado