ios – Core Data Nullify什么时候更新关系?

前端之家收集整理的这篇文章主要介绍了ios – Core Data Nullify什么时候更新关系?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有和想要的

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

>删除A时,所有与A关系的B都应该被删除,所以A与B的关系的删除规则设置为级联 – >工作正常
>删除B时,只能将关系恢复为A,因此B与A的关系的删除规则设置为nullify – >不工作(只有延迟)

问题描述:

所以我有与这个问题“Core Data Nullify rule doesn’t work?”中提到的完全相同的问题:我删除一个与A有关系的B,并且之后,我计算剩余B的数量,A与A有关系,它与之前.在这个问题上接受的答案是使用级联而不是无效,因为无效是:

Nullify sets the pointer to null when the object is deleted. If you
have an array of pointers it doesn’t remove it,it just sets it to
null.

我看到有两个问题:

>我很确定级联是错误的规则在这种情况下,因为它也会删除A,当删除B,这不是我想要实现的. (我尝试了,结果是我的预期:A也被删除).
>一个集合不能有null作为其元素之一,除了一个使用NSNull单例.所以我怀疑这是无效规则所做的.

经过一番实验,我发现,如果我删除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”.所以无效删除规则确实按照我想要的方式工作,但有一点延迟.

问题:

我所说的2个问题是否有效?
>为什么无效只能在延迟之后更新关系,这是什么延迟?或者在删除NSManagedObject之后,关系得到更新?

解决方法

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

>明确删除关系:

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

希望它有帮助.

猜你在找的iOS相关文章