私のアプリケーションには競合状態があり、複数の API リクエストがまったく同じデータを返し、それらを保存しようとする可能性があります。モデルに validateForInsert を追加することで、これが起こらないようにしたいと考えています。検証の前提は、このように識別子キーが既に存在するかどうかを確認するだけです
- (BOOL)validateForInsert:(NSError *__autoreleasing *)error
{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([CWDeal class])];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"identifier == %@", self.identifier];
NSError *validateError;
int count = [[(CWAppDelegate *)[[UIApplication sharedApplication] delegate] privatewriterManagedObjectContext] countForFetchRequest:fetchRequest error:&validateError];
if (count > 0) {
return FALSE;
}
return [super validateForInsert:error];
}
問題は、何も保存されないことです。privateWriterManagedObjectContext(PSC に接続) の親を持つ managedObjectContext(メイン スレッド) があります。ものをインポートするときは、managedObjectContext の親を持つ importContext (いくつかのバックグラウンド スレッド) を作成します。新しいデータを取得してフローを保存しようとすると、次のようになります。
(検証は、オブジェクトの privateWriterMOC をチェックしていることを思い出してください)
importContext でオブジェクトを作成 -> 保存 -> 検証 -> わかりました。
(データは importContext の親である managedObjectContext にプッシュされます)。
managedObjectedContext を保存 -> 検証 -> わかりました。
(データは managedObjectContext の親である privateWriterMOC にプッシュされます)。
privateWriterMOC を保存 -> 検証 -> 失敗。privateWriterMOC は、オブジェクトがそのコンテキスト上にあることを認識し、それらを保存しません。
validateForInsert の使用に関するドキュメントはあまりないように思われるので、これを行う方法について誰かが提案してくれることを願っていますか?