我的应用程序有一个竞争条件,多个 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];
}
问题是没有任何东西可以保存。我有一个 managedObjectContext(主线程),它有一个 privateWriterManagedObjectContext 的父级(连接到 PSC)。当我导入东西时,我将创建一个 importContext(一些后台线程),它有一个 managedObjectContext 的父级。当我获得新数据并尝试保存流程时,将是这样的。
(记住验证是检查对象的 privateWriterMOC)
在 importContext 上创建对象 -> 保存 -> 验证 -> 好的。
(数据被推送到 importContext 的父对象 managedObjectContext)。
保存 managedObjectedContext -> 验证 -> 好的。
(数据被推送到 managedObjectContext 的父级 privateWriterMOC)。
保存 privateWriterMOC -> 验证 -> 失败。privateWriterMOC 识别出对象在其上下文中并且不会保存它们。
似乎没有很多关于使用 validateForInsert 的文档,所以我希望有人对如何执行此操作有建议?