Core Data Nullify何时更新规则?
我拥有和想要的东西:
我有一对多的关系A > B(订购了多对多的部分)。
- 当删除A时,与A的关系的所有B也应该被删除,因此A与B的关系的删除规则被设置为级联– >工作正常
- 删除B时,只应删除返回A的关系,因此B与A关系的删除规则设置为无效– >不起作用 (仅在延迟后)
问题描述:
所以我遇到了与此问题中所述完全相同的问题“Core Data Nullify规则不起作用?” :我删除了一个与A有关系的B,然后立即计算剩余B的数量,A与之有关系,并且与以前相同。 该问题中接受的答案是使用级联而不是nullify,因为nullify的作用是:
删除对象时,Nullify将指针设置为null。 如果你有一个指针数组,它不会删除它,它只是将它设置为null。
我看到有两个问题的答案:
- 我很确定在这种情况下cascade是错误的规则,因为它在删除B时也会删除A,这不是我想要实现的。 (尽管如此,我尝试了它,结果是我的预期:A也被删除了)。
- 除了使用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);
}
现在当按下按钮再次调用上面的方法而不做任何介于两者之间的任何事情时,突然关系被更新并且打印出“A与B之前的关系: 3之前的关系”。 因此,nullify删除规则确实可以正常工作,但有一点延迟。
问题:
- 我说的2个问题是否有效?
- 为什么nullify只会在延迟后更新关系,什么是延迟? 或者在删除NSManagedObject后关系会在哪个时刻更新?
你是对的。 答案是不正确的。 关于第二点。 方法-deleteOdject不会删除对象,因为它只是将对象标记为已删除。 要完成删除,您需要保存托管对象上下文,然后您将看到nullify规则按预期工作。 如果您此时不想保存上下文,可以采用以下两种方式:
-
明确删除关系:
NSManagedObject* objectToDelete = [instanceOfA.relationToB lastObject]; [context deleteObject:objectToDelete]; NSMutableSet* relationships = [instanceOfA mutableSetValueForKey:@"relationToB"]; [relationships removeObject:objectToDelete];
-
请求上下文处理其未来的更改(这意味着计算由删除引起的更改):
[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在运行循环结束时或执行-save:
时自行执行-processPendingChanges
,这就是为什么你会看到一些延迟。
希望能帮助到你。
完成对Core Data对象的更改后,应在托管对象上下文中调用save : . 我想保存操作将更新所有关系。