Core Data Nullify何时更新规则?

时间:2013-02-12 17:04:13

标签: ios objective-c cocoa-touch core-data null

我拥有和想要的东西:

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

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

问题描述:

所以我遇到了与这个问题"Core Data Nullify rule doesn't work?"中提到的问题完全相同的问题:我删除了一个与A有关系的B,然后我立即计算剩余B的数量,A有关系和以前一样。该问题中接受的答案是使用级联而不是无效,因为nullify的作用是:

  

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

我在回答中看到了两个问题:

  1. 我很确定在这种情况下cascade是错误的规则,因为它在删除B时也会删除A,这不是我想要实现的。 (尽管如此,我尝试了它,结果是我的预期:A也被删除了。)
  2. 除了使用NSNull单例之外,集合不能将null作为其元素之一。所以我怀疑这是无效规则的作用。
  3. 经过一些实验后我发现,如果我删除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);
    

    }

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

    问题:

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

2 个答案:

答案 0 :(得分:15)

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

  1. 明确删除关系:

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

    [context processPendingChanges];
    
  3. 在你的例子中:

    [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:,这就是为什么你会看到一些延迟。

    希望它有所帮助。

答案 1 :(得分:0)

完成对Core Data对象的更改后,应在托管对象上下文中调用save:。我想保存操作将更新所有关系。