什么时候核心数据抵消规则更新的关系?(When does Core Data Nullify rul

2019-08-16 22:42发布

我有什么,想:

我有一对多的关系A <--- >> B(的一​​对多部分被排序)。

  • 当删除所有B的一个相对于应删除一样,所以对A的关系到B的删除规则设置为级联- >做工精细
  • 当删除只有B的关系回到A应该被清除,所以对于B的关系A中删除规则设置为抵消- >不 (仅在延迟后) 工作

问题描述:

所以,我有相同问题在这个问题表示“核心数据抵消规则不起作用?” :我删除了关系到A并且之后,我算剩余B的数量,A有一个关系的B和它是和以前一样。 在这个问题接受的答案是因为什么不废掉是使用级联,而不是废止:

抵消设置指向空当对象被删除。 如果你有一个指针它不会删除它的阵列,它只是设置为null。

我看到2个问题与答案:

  1. 我敢肯定级联是在这种情况下,错误的规则,因为它也将删除B时的,这不是我想达到什么删除a。 (我试了一下还是,结果是我所期待的:一个也已删除)。
  2. 收集不能有null作为其内容之一,除了一个使用NSNull单。 所以我怀疑,这是抵消规则做什么。

试验了一下后,我发现,如果我删除B检查被立即删除,但相对于不立即清除,但只有一点点延迟后的一个实例:

// Method is called by pressing a button
-(void)removeLastBOfA:(A *)instanceOfA
{
    // Prints 4
    NSLog(@"fetch all b's count before:%d", [context fetchAllBs].count);
    // Prints 4
    NSLog(@"A's relation to B count before: %d", instanceOfA.relationToB.count);

    [context deleteObject:[instanceOfA.relationToB lastObject]];

    // Prints 3
    NSLog(@"fetch all b's count after:%d", [context fetchAllBs].count);
    // Prints 4, but should be 3. Last Object of A's relationToB is still the object that was deleted
    NSLog(@"A's relation to B count after: %d", instanceOfA.relationToB.count);

}

现在按下按钮,而在其间没有做任何事情之上再次调用方法时,突然之间的关系被更新,“A对b之前计数的关系:3”被打印出来。 所以废掉删除规则不工作,因为我想它,但有一点延迟。

问题:

  1. 是2个问题我说有效吗?
  2. 为什么抵消一段时间后再更新的关系,什么是延迟? 还是在这一点做的关系得到删除NSManagedObject后更新?

Answer 1:

是的,你是对的。 答案是不正确的。 关于第二点。 为删除如你预期它-deleteOdject不删除对象的方法只是标志着对象。 要完成删除您需要保存管理对象上下文,然后你会看到,废止规则按预期工作。 如果你不希望保存上下文在这一刻,你可以遵循两种方式:

  1. 明确删除关系:

     NSManagedObject* objectToDelete = [instanceOfA.relationToB lastObject]; [context deleteObject:objectToDelete]; NSMutableSet* relationships = [instanceOfA mutableSetValueForKey:@"relationToB"]; [relationships removeObject:objectToDelete]; 
  2. 请上下文处理其未来的变化(这意味着计算由你缺失的变化):

     [context processPendingChanges]; 

在您的例子:

[context deleteObject:[instanceOfA.relationToB lastObject]];
[context processPendingChanges];
// Prints 3
NSLog(@"fetch all b's count after:%d", [context fetchAllBs].count);
NSLog(@"A's relation to B count after: %d", instanceOfA.relationToB.count);

之后,你会看到预期的结果。

的NSManagedObjectContext确实-processPendingChanges在运行循环结束本身或表演时-save:所以这就是为什么你看到一些延迟。

希望能帮助到你。



Answer 2:

你应该叫保存:你的管理对象范围内完成更改到核心数据对象后。 我想象中的保存操作,将更新所有关系。



文章来源: When does Core Data Nullify rule update relations?