iOS核心数据中的孤立对象

时间:2014-11-17 04:50:00

标签: ios core-data swift

假设我有一个名为Player的CoreData实体类型,并且它与一个名为purpose的实体类型具有一对一的关系(PlayerPurpose)。为了完整起见,请假设我们在PlayerPurpose中有一个名为parentPlayer的反比关系。请考虑以下快速代码:

// Assume we already have a player object in a NSManagedObjectContext called context:
player.purpose = NSEntityDescription.insertNewObjectForEntityForName("PlayerPurpose",
                 inManagedObjectContext: context) as PlayerPurpose;

// Later in the code, we set the value to nil (or we could have replaced
// it with another call to insertNewObjectForEntityForName)
player.purpose = nil;
// What happens to the previous playerPurpose object within the Managed Object Context?

我的问题:当托管对象上下文中的唯一引用设置为nil(或替换为另一个对象)时,托管对象上下文中的原始playerPurpose对象会发生什么?

这与关系删除规则无关,因为我没有明确删除任何对象 - 我将其从任何有意义的关系中移除,使其成为孤儿。

从ARC的角度来看(如果PlayerPurpose只是一个普通的非托管对象),原始的PlayerPurpose实例现在没有引用,因此它可以从内存中清除 - 但是在托管对象上下文中会发生什么? CoreData是否将其识别为孤立对象并通过上下文删除它?

如果没有,那么我假设我必须小心删除通过上下文创建的任何托管对象,如果我要删除所有对它的引用。假设是这种情况,是否有一个好的模式用于确保孤立对象从NSManagedObjectContext中清除,并且它们不再存储在持久存储中?

谢谢!

1 个答案:

答案 0 :(得分:4)

核心数据不会自动删除此方案中的对象,因为"孤立的"是您的代码所具有的概念,而不是Core Data可识别的概念。没有理由删除PlayerPurpose对象只是因为它的一个关系是零。

确保删除PlayerPurpose个实例的最可靠方法是

  1. 为您的实体创建自定义NSManagedObject子类(如果您还没有这些子类)。
  2. 覆盖purpose子类上Player的setter方法。如果新值为nil,则删除旧值。
  3. 您也可以通过确保在适当的时间致电deleteObject:来解决这个问题。或者,您可以执行清理步骤,在其中使用PlayerPurpose的nil值获取每个parentPlayer并删除它们。