gpt4 book ai didi

ios - iOS CoreData 中的孤立对象

转载 作者:搜寻专家 更新时间:2023-11-01 06:24:07 26 4
gpt4 key购买 nike

假设我有一个名为 Player 的 CoreData 实体类型,它与一个名为 PlayerPurpose 的实体类型具有一对一关系(purpose) .为了完整起见,假设我们在 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?

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

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

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

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

谢谢!

最佳答案

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

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

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

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

关于ios - iOS CoreData 中的孤立对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26965730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com