【问题标题】:Core Data ensuring data uniqueness核心数据确保数据唯一性
【发布时间】:2014-08-03 20:39:22
【问题描述】:

我使用 Magical record 和 Core Data 已经有一段时间了,但我仍然无法弄清楚如何确保对象的唯一性。

假设我有一个函数:

- (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 个)。

如何确保只有 1 个具有给定值的对象退出?

附言—validateValue:forKey:error: 无济于事,因为它调用了 BEFORE 上下文合并(在保存对象期间)。

【问题讨论】:

    标签: ios core-data magicalrecord


    【解决方案1】:

    我想一种方法是在合并和更改或删除重复值之前进行检查。您可以通过收听NSManagedObjectContextWillSaveNotification 并在调用mergeChangesFromContextDidSaveNotification 之前进行更改来做到这一点。

    【讨论】:

    • 我猜你的意思是在NSManagedObjectContextWillSaveNotificationNSManagedObjectContextDidSaveNotification之间进行更改
    • 我不确定我是否理解你。 NSManagedObjectContextWillSaveNotification 只有上下文,将被保存。我应该如何检查唯一性?
    • @NikitaTook WillSave 可能更好,谢谢。但第二项不是通知,而是上下文方法。
    • @user2786037 这将是父上下文的通知。您要纠正的所有欺骗都应该已经存在。
    • @Mundi 所以你的意思是,我只需要找到所有重复项(如[MyModel MR_findFirstWithPredicate....)并删除重复项?
    【解决方案2】:

    在几个循环之后这不起作用的原因是 saveWithBlock 方法正在为您分派队列。因此,每个本地上下文都是一个全新的上下文。每个 localContext 都不知道循环创建的任何其他内容中的内容。这意味着 findFirst 方法每次都不会返回任何内容,并会创建一个新的但重复的模型对象副本。解决这个问题的方法是,

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

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

    【讨论】:

    • 我知道问题出在哪里,但我不能只打 1 个电话。例如,如果foo 是一个更新函数(它从服务器同步数据),它应该在不同的情况下调用(例如收到推送和应用程序激活),但有时两种情况会同时发生
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多