Core Data Nullify何时更新规则?

And*_*iro 10 null cocoa-touch core-data objective-c ios

我拥有和想要的东西:

我有一对多的关系A <--- >> B(订购了多对多的部分).

  • 当删除A时,与A关系的所有B也应该被删除,因此A与B的关系的删除规则被设置为级联- >工作正常
  • 删除B时,只应删除返回A的关系,因此B与A关系的删除规则设置为无效- >不起作用(仅在延迟后)

问题描述:

所以我遇到了与此问题中所述完全相同的问题"核心数据无效规则不起作用?" :我删除了一个与A有关系的B,然后立即计算剩余B的数量,A与之有关系,并且与以前相同.该问题中接受的答案是使用级联而不是无效,因为nullify的作用是:

删除对象时,Nullify将指针设置为null.如果你有一个指针数组,它不会删除它,它只是将它设置为null.

我看到这个答案有两个问题:

  1. 在这种情况下,我很确定cascade是错误的规则,因为它在删除B时也会删除A,这不是我想要实现的.(尽管如此我试过了,结果就是我所期待的:A也被删除了).
  2. 除了使用NSNull单例之外,集合不能将null作为其元素之一.所以我怀疑这是无效规则的作用.

经过一些实验我发现,如果我删除B的实例,它会被立即删除,但是与A的关系不会立即被清除,而是仅在稍微延迟之后:

// 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);
Run Code Online (Sandbox Code Playgroud)

}

现在当按下按钮再次调用上面的方法而不做任何介于两者之间的任何事情时,突然关系更新并且打印"A与B之前的关系:3之前的关系".因此,nullify删除规则确实可以正常工作,但有一点延迟.

问题:

  1. 我说的2个问题是否有效?
  2. 为什么nullify只在延迟后才更新关系,那是什么延迟?或者在删除NSManagedObject后关系会在哪个时刻更新?

Mar*_*ski 15

是的,你是对的.答案是不正确的.关于第二点.方法-deleteOdject不会删除对象,因为它只是将对象标记为已删除.要完成删除,您需要保存托管对象上下文,然后您将看到nullify规则按预期工作.如果您此时不想保存上下文,可以采用以下两种方式:

  1. 明确删除关系:

    NSManagedObject* objectToDelete = [instanceOfA.relationToB lastObject];
    [context deleteObject:objectToDelete];
    NSMutableSet* relationships = [instanceOfA mutableSetValueForKey:@"relationToB"];
    [relationships removeObject:objectToDelete];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 请求上下文处理其未来的更改(这意味着计算由删除导致的更改):

    [context processPendingChanges];
    
    Run Code Online (Sandbox Code Playgroud)

在你的例子中:

[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);
Run Code Online (Sandbox Code Playgroud)

之后,您将看到预期的结果.

NSManagedObjectContext -processPendingChanges在运行循环结束时或执行时自行执行-save:,因此这就是您看到一些延迟的原因.

希望能帮助到你.