1

core-data を使用して、iOS で奇妙なバグを観察しています。基本的に、私のセットアップは次のとおりです- 2 つの NSManagedObjectContexts がtempContextあり、mainContext. tempContextエンティティを作成および編集するための一時的な「スクラッチパッド」として使用し、それらを保存する場合は、に移動しmainContextて保存します。mainContextは の親ではないことに注意してくださいtempContext

移動は次のように行われます-

[1] newEntity.property1 = @"SomeProperty";
    newEntity.managedObjectContext // this is tempContext currently
[2] saveEntityInTempContext
[3] newEntity = (Entity *)[mainContext objectWithID:newEntity.objectID];
[4] [mainContext insertObject:newEntity];

さて、insert[4] の後、 にチェックを入れるnewEntity.property1と に設定されていnilます。しかし、[3]の次にプロパティを確認し、[4]の後にプロパティを確認すると、正しく「SomeProperty」と表示されます。ここでフォールトを強制することでどのように違いが生じるのかわかりません。

私の目標は、エンティティをあるコンテキストから別のコンテキストに移動することです。

4

1 に答える 1

1

直接の原因が何であるかはわかりませんが、それはほぼ間違いなく、実際には意味をなさない不要なステップの奇妙な副作用です。最後のステップで例外が発生しないことにちょっと驚いています。

具体的には、手順4は完全に不要です。手順3を完了すると、からロードされたインスタンスが作成されmainContextます。その時点でこれ以上何もする必要はありません。insertObject同じ管理対象オブジェクトコンテキストから検索したばかりのオブジェクトを呼び出すことは意味がありません。

それを想定し、同じ永続ストアコーディネーターtempContextmainContext使用すると、このオブジェクトのライフサイクルは次のようにステップで進行します。

  1. newEntityすでに作成されていますが、保存されていません。tempContext知ってnewEntityいますが、データストアは知りません(そしてもちろんmainContextそれについて知りません)。
  2. 保存後、データストアにはのレコードがありnewEntityます。newEntityのオブジェクトIDが永続的な値に変更されます。
  3. objectWithID:呼び出しの結果、のインスタンスはnewEntity、を介して検索された別のインスタンスに置き換えられますmainContext。これらの属性は、データストアからロードされたため、手順1で作成し、手順2でデータストアに保存した属性と一致します。
  4. 手順3で取得しinsertObjectた新しいものがから検索されたため、呼び出しは目的を果たしません。つまり、それはすでにそれを知っているということです。これは私が例外を期待していた場所です。例外は発生しませんが、それでも呼び出しは意味がありません。newEntitymainContextmainContext

だから、私はステップ#4をドロップして、それで終わります。

于 2013-01-12T00:25:38.073 に答える