iOS CoreData 中的孤立对象

FTL*_*Guy 2 core-data ios swift

假设我有一个名为 CoreData 的实体类型Player,它purpose与一个名为PlayerPurpose. 为了完整起见,假设我们有一个反比关系PlayerPurposeparentPlayer。考虑以下 swift 代码:

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

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

这与关系删除规则并不真正相关,因为我没有明确删除任何对象——我是从任何有意义的关系中删除它,使其成为孤儿。

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

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

谢谢!

Tom*_*ton 5

在这种情况下,Core Data 不会自动删除对象,因为“孤立”是您的代码具有但 Core Data 无法识别的概念。没有理由PlayerPurpose仅仅因为它的一个关系为零就删除一个对象。

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

  1. NSManagedObject为您的实体创建自定义子类(如果您还没有它们)。
  2. 覆盖子类purpose上的setter 方法Player。如果新值为零,则删除旧值。

您也可以通过确保deleteObject:在适当的时间打电话来解决这个问题。或者您可以运行一个清理步骤,在该步骤中获取每个PlayerPurpose值为 nil 的值parentPlayer并删除它们。