2

CoreData に大きく基づいた iPad 料理アプリケーションを作成しています。私のアプリには、2 種類の情報を含むレシピを編集するための画面があります。

  1. レシピ カテゴリ\サブカテゴリと国を含むリスト
  2. その他すべてのレシピ関連情報

このリストのそれぞれは、ポップオーバーで編集できます。このリストの変更はすぐに保持されます (つまり、ユーザーがレシピ カテゴリを可能なカテゴリ リストに追加するが、レシピの作成をキャンセルした場合、このカテゴリはすべてのレシピで使用可能になります)。各タイプの情報を処理するために、 2 つの別個の NSManagedObjectContextsを実装することが決定されました。レシピ管理のメイン コンテキストとリストのサポート コンテキストです。

MagicalRecordフレームワークを介して実行されるすべてのコア データ操作。どちらのコンテキストも、MagicalRecord のデフォルト コンテキストを親として持ちます。各コンテキストは、他のコンテキストの変化を観察します。すべてのコンテキストがメイン スレッドで作成および使用されているため、この問題はマルチスレッドの問題とは関係がないようです。

サポート コンテキストでオブジェクトを作成し、オブジェクトの作成直後にサポート コンテキストの変更を永続化しようとすると、すべて問題なく動作します。新しく作成されたオブジェクトが作成直後に削除されているときに問題が発生します-EXC_BAD_ACCESを受け取りました。ただし、エンティティは正しく永続化されており、次回の起動時に、同期の問題なしで使用および削除される可能性があります。

1 注意: オブジェクトがNSManagedObjectContext の existingObjectWithID: メソッドによってMain コンテキストからアクセスされている場合、このオブジェクトを削除することが可能になります。ただし、メイン コンテキスト (メイン コンテキストとサポート コンテキストの両方の親コンテキスト) の保存時にクラッシュが発生します。

これが私のコードです:

エンティティの作成:

RecipeCategory* category = [RecipeCategory MR_createInContext:_supportingContext];
category.name = itemName;
[_supportingContext MR_saveToPersistentStoreAndWait];

エンティティの削除:

[(RecipeCategory*)itemToRemove MR_deleteEntity];
[_supportingContext MR_saveToPersistentStoreAndWait];

コンテキストの作成と観察のセットアップ:

[_mainContext MR_stopObservingContext:_supportingContext];
[_supportingContext MR_stopObservingContext:_mainContext];
_mainContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
_supportingContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
[_mainContext MR_observeContextOnMainThread:_supportingContext];
[_supportingContext MR_observeContextOnMainThread:_mainContext];

この問題を解決するためにどのように動けばよいのか混乱しているため、この問題の原因を教えてください。Core Data ドキュメントの変更管理セクションでは、何も提供されません。同じ結果がグーグルに与えられました。

4

1 に答える 1

0

そうしないでください。ウォッチャーも監視している別のコンテキストを監視している...それは悪いことです。最初に、ネストされたコンテキストのルールと、保存時にデータがどのように別のコンテキストに流れるかを理解する必要があります。

あなたの場合、NSMOC で MR_confinementContext メソッドを探してください。これにより、古いスレッド制限モデルを使用するコンテキストが作成されます。これは、スレッドのクラッシュを回避するのに役立つ場合があります。しかし、最初に、循環観察を行わないでください...データが流れ込みます

于 2013-02-26T16:48:46.393 に答える