1

タイトルの質問の簡単な例:1つのスレッドがPlaceエンティティを準備し、それに対して何らかの処理を行っており(特定のフィールドへの入力とその計算には時間がかかります)、その間にもう1つのスレッドはすでにCategoryエンティティを準備しています。2番目の「Category」スレッドはsave:&errorを使用してCategoryエンティティを永続化するため、処理ジョブが終了していない間も最初のスレッドのPlaceエンティティが保存されます。

私は正しいですか?1つの共有モックを使用した場合に説明されている問題が表示されますか?

ありがとう!

4

2 に答える 2

1

NSManagedObjectContextスレッド間でを共有しないでください。NSManagedObjectスレッド間でを共有しないでください。本当に例外はありません。コアデータとの同時実行を読み、それが説明するパターンを適用します。

于 2012-10-10T06:09:13.447 に答える
1

実際には、それは可能であり、あなたが探している方法は次のとおりです。

-(void)mergeChangesFromContextDidSaveNotification:(NSNotification *)notification;

NSManagedObjectContextスレッドごとに異なるものを作成する必要があります。必要なNSManagedObjectContextのは、NSManagedObjectContextDidSaveNotificationキーをに入れNSNotificationてデフォルトのセンターに登録することだけです。その呼び出しmergeChangesFromContextDidSaveNotificationでメインスレッドを実行すると、メソッドを呼び出すたびに変更がマージされますsave:&error

注:私の意見では、オブジェクトをフェッチしている間、別のコンテキストに属している可能性があり(フェッチ後はゼロになります)、別の方法でフェッチする必要がある場合は、少しデメリットがあります。

NSManagedObjectID *objectID = [YourObject objectID];

YourObject *copy =(YourObject*) [managedObjectContext objectWithID:objectID];

それが役に立てば幸い。これが私が言っていることをよりよく理解するためのリンクです。

于 2012-10-10T06:15:42.557 に答える