【问题标题】:Can a managed object with unmanaged properties fault?具有非托管属性的托管对象会出错吗?
【发布时间】:2010-10-19 21:04:50
【问题描述】:

Core Data 文档说,如果需要,对象可能会因节省内存而出错。如果您的对象的属性不是托管属性,会发生什么情况?

例如,假设您有一个 Department 类,它是 NSManagedObject 的子类。它有一个位置 iVar + 访问器。 location 属性不是 Department 的属性;它不受管理,也永远不会持久化。

如果您有一个 Department 对象数组,或者一个与 Department 一对一关系的 Employee 对象,那么 Department 是否有可能出错?如果你设置了Department.location,你能确定这个location会一直在那里吗,还是有可能是Department出错了,那么你就丢失了location中存储的值?

【问题讨论】:

    标签: objective-c core-data nsmanagedobject fault


    【解决方案1】:

    部门仍然可能出错,它只会出错您在模型中描述的属性。通常,您所描述的情况由“瞬态”属性覆盖,这些属性未存储在 CoreData 中,但对象模型可以识别它们。

    当您实现瞬态属性时,您需要提供为该属性提供值所需的存储(或计算)。

    在您的情况下,假设您的“位置”值将来不会存在是完全合理的,因为它只会在实际托管对象保留在内存中时才存在。换句话说,任何导致托管对象被释放的操作,例如上下文重置、保存或从保存通知更新都可能导致值丢失(因为它所绑定的托管对象变成故障或无效)。

    【讨论】:

      【解决方案2】:

      我不相信非托管数据会保留在那里。即使现在这样做,将来的行为也可能会发生变化。更重要的是,从架构上讲,我根本不建议将非托管数据保留在托管对象中。你最好过:

      1. 使其成为托管数据,或者
      2. 使非托管数据可根据托管数据计算,或者
      3. 制作一个对象,其中包含非托管数据和部门作为 ivars。

      【讨论】:

      • 使用上面的2.,我使用瞬态属性来存储位置值;似乎工作正常。有人用过不同的方法吗?
      猜你喜欢
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2012-05-22
      • 2023-04-09
      • 2021-07-15
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      相关资源
      最近更新 更多