Ios 确保数据唯一性的核心数据

Ios 确保数据唯一性的核心数据,ios,core-data,magicalrecord,Ios,Core Data,Magicalrecord,我已经用神奇记录和核心数据工作了一段时间,但我仍然不知道如何确保对象的唯一性 假设我有一个函数: - (void) foo { [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { // find if model with x = myValue exists MyModel *model = [MyModel MR_findFirstWithPredicate:[N

我已经用神奇记录和核心数据工作了一段时间,但我仍然不知道如何确保对象的唯一性

假设我有一个函数:

- (void) foo {
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        // find if model with x = myValue exists
        MyModel *model = [MyModel MR_findFirstWithPredicate:[NSPredicate predicateWithFormat:@"x = %@", myValue] inContext:localContext];

        // if there is no model - create it!                          
        if (!model) {   
            model = [MyModel MR_createInContext:localContext];
            model.x = myValue;
            // etc...
        }
    }];
}
在调用
foo
两次(或3次、4次……等等)之前,一切正常。现在
localContext
不知道其他线程和唯一性检查过程中的
localContext
。因此,在上下文合并之后,我有2个(3,4…等)具有给定值的实例(而不是1)

如何确保只有一个具有给定值的对象存在


PS
-validateValue:forKey:error:
不会有帮助,因为它在上下文合并之前(保存对象期间)称为

我想一种方法是在合并之前检查并更改或删除重复的值。您可以通过收听NSManagedObjectContextWillSaveNotification来实现这一点,并在调用
mergeChangesFromContextDidSaveNotification
之前进行更改。在几个循环之后,这种方法不起作用的原因是saveWithBlock方法正在为您在后台调度队列。因此,每个本地上下文都是一个新的上下文。每个localContext都不知道由循环创建的任何其他本地上下文中的内容。这意味着findFirst方法每次都不返回任何内容,并创建一个新的但重复的模型对象副本。解决这个问题的方法是

  • 在saveWithBlock方法中执行所有循环
  • 创建自己的上下文,并将其用于循环中的所有数据保存

其思想是对所有操作使用相同的上下文,以便可以在上下文中查找数据。在某些情况下,这些数据将是您新创建的和未保存的数据

我知道问题出在哪里,但我不能只打一个电话。例如,如果
foo
是一个更新函数(它从服务器同步数据),则应在不同的情况下调用它(例如,收到推送,应用程序变为活动状态),但有时这两种情况同时发生,我想你的意思是在
NSManagedObjectContextWillSaveNotification
NSManagedObjectContextDidSaveNotification
之间进行更改,我不确定我是否理解你的意思<代码>NSManagedObjectContextWillSaveNotification只有将要保存的上下文。我应该如何检查唯一性?@nikitatake
WillSave
可能更好,谢谢。但第二项不是通知,而是上下文方法。@user2786037它将是父上下文的通知。您要更正的所有重复项都应该已经存在。@Mundi您的意思是,我只需要找到所有重复项(如
[MyModel MR_findFirstWithPredicate….
)并删除重复项?