【问题标题】:What is CoreData faulting?什么是 CoreData 故障?
【发布时间】:2013-01-16 01:30:22
【问题描述】:

谁能解释一下coredata故障是什么意思?我知道这是一种减少内存的机制。但我的问题是,如果当我们尝试使用错误对象时,我们是否需要调用任何刷新方法或者 CoreData 会为我们选择值?如果 CoreData 为我们处理它,如果故障对象从实际持久存储中删除并且我们尝试通过故障对象访问它会发生什么?它会抛出任何异常吗?

【问题讨论】:

    标签: ios macos cocoa core-data


    【解决方案1】:

    在 Core Data 中,故障是占位符,或“未实现的对象”。它们是引用其他 NSManagedObjects 的小对象,仅在需要时才将其提取到内存中。这种故障机制旨在提高性能并减少内存使用。

    一般来说,故障机制是透明的;当您从 NSManagedObjectContext (MOC) 中检索对象时,您无法分辨(在其正常使用过程中)它是错误对象还是已实现对象。在大多数情况下,当需要这样做时,Core Data 框架会自动将故障转换为已实现的对象(“触发”),例如:访问对象的属性时。如果你需要自己触发一个错误,你可以通过调用它的 willAccessValueForKey: 方法和一个 nil 参数来实现。

    【讨论】:

    • " 当您从 NSManagedObjectContext (MOC) 检索对象时,您无法分辨(在其正常使用过程中)它是错误还是已实现的对象“-是的,我们可以,使用 @ 987654321@
    【解决方案2】:

    来自 Dhruv 的精彩回答!在回答您的最后一个问题时,如果您尝试访问首先出现故障然后被删除的托管对象,您将看到 NSObjectInaccessibleException 和消息“核心数据无法完成故障”

    【讨论】:

    • 嘿,谢谢你 :) 还有一个查询,我需要检查 managedObject 是否有故障,我可以使用“isFault”方法检查吗?现在要做的是,我将使用“isFault”方法检查对象是否出现故障,如果对象出现故障,我将使用“existingObjectWithID:”方法从持久存储中获取对象。这是一个正确的方法吗?
    • 当您访问尚未从缓存或持久存储中实现的属性时,通常您会依靠 CoreData 自动为您完成故障。当我知道对象身份时,我通常使用 existingObjectWithID,但不知道它的出处(即它的 ManagedObjectContext 是否是在执行我的代码的同一线程上创建的)
    【解决方案3】:

    来自 Coredata 参考资料 (link):

    故障会减少您的应用程序消耗的内存量。一种 fault 是一个占位符对象,代表一个托管对象 还没有完全实现,或者是一个集合对象 表示关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-22
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 2012-10-19
      • 2012-08-07
      相关资源
      最近更新 更多