サーバーに保存されているソースから取得したデータの挿入と削除を管理するために、4 つの NSManagedObjectContext を使用しています。MOC 間の関係は次のように設定されています。
_masterManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_masterManagedObjectContext setPersistentStoreCoordinator:_psc];
_mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainManagedObjectContext setParentContext:self.masterManagedObjectContext];
_insertionContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_insertionContext setParentContext:self.mainManagedObjectContext];
_cacheContext = _insertionContext;
ご覧のとおり、masterMOC は persistantStoreCordinator にリンクされ、データの永続性を処理します。mainMOC には masterMOC との親関係があり、UI 上の FRC にデータを提供し、FRC デリゲートがデータの更新によって行われた変更を監視できるようにするために使用されます。insertMOC には mainMOC との親関係があり、NSOperation を使用して別のスレッドで作成され、メイン メソッド呼び出しでインスタンス化されています。cacheMOC は、挿入クラスから insertMOC に渡され、そのプロパティを継承します。上記のようにすべて機能していますが、データを更新するとアプリがクラッシュします。
問題は、insertMOC がそれらを削除した後の ManagedObjectID の正しいセットが何であるかに関して、コンテキスト間に混乱があることです。
これは、古いManagedObjectsを削除する方法です
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Event" inManagedObjectContext:_insertionContext]];
[fetchRequest setIncludesPropertyValues:NO];
NSError *error;
NSArray *array = [NSArray array];
array = [_insertionContext executeFetchRequest:fetchRequest error:&error];
[self.insertionContext obtainPermanentIDsForObjects:array error:&error];
if (array.count >0 && [self.kEntity isEqualToString:@"Event"]) {
[array enumerateObjectsUsingBlock:^(Event *obj, NSUInteger idx, BOOL *stop) {
[_insertionContext deleteObject:obj];
}];
ノート。PermenentObjectIDsForObjects を取得しない場合: エラー: この時点でアプリがクラッシュします。
これが実行された後、私は inertionContext を保存しません。これは、変更を監視する FRC デリゲートで UI の更新をトリガーするためです。代わりに、新しいデータを収集し、1 つのエンティティの結果の一部をキャッシュに挿入します。キャッシュを機能させるには、マネージド オブジェクト ID を取得して重複を見つけるためのフェッチ リクエストを作成する必要があります。この時点でアプリがクラッシュします。
ネストされたリレーションシップを持つ MOC のドキュメントに関する私の理解では、fetchRequest は、persistantStore に保存されたものからすべての MOC を介してデータを取得するということです。しかし、これが事実である場合、それらを削除するためにフェッチするときに、insertMOC に強制的に PermanentOBJectID を取得させる必要はありません。そうは言っても、私のキャッシュはpersistanStoreからpermanentIDを取得でき、その結果クラッシュしているようです。
cacheMOC は、他のものと同様に、insertMOC との関係で設定する必要がありますか? これを機能させるには、キャッシュも独自のプライベートスレッドスレッドで発生するように設定する必要がありますか? FRC が結果を更新しないように mainMOC をロックしてから、insertMOC を保存して削除を永続化する必要がありますか?