【问题标题】:NSManagedObject entity class methodNSManagedObject 实体类方法
【发布时间】:2017-10-19 05:33:05
【问题描述】:

我最近意识到 NSManagedObject 子类继承了一个类方法entity,该方法可用于获取该类的NSEntityDescription。但是,我习惯于在创建NSEntityDescription 时指定上下文,就像entityForName:inManagedObjectContext: 一样。是否可以使用更简单的entity 方法以及它将与什么上下文相关联?

此方法是由 Apple 记录的 not really

【问题讨论】:

  • 哪种语言和哪个iOS版本? (请添加标签)
  • 我不知道可以在不指定上下文的情况下创建 NSManagedObject 的方法。我想实体与创建 NSManagedObject 的任何上下文相关联。
  • 这是一个类方法,因此它与 NSManagedObject 无关。

标签: ios cocoa core-data ios10


【解决方案1】:

NSEntityDescription 不是托管对象上下文的一部分,它是托管对象模型的一部分。

当您加载数据模型时,它包含的所有实体描述都会被加载。类方法+entity 有效,因为实体描述是与模型对象一起创建的。如果您尝试在加载模型之前调用此方法,它会在 Objective-C 中返回 nil。 (在 Swift 中由于某种原因它返回一个非可选值,所以它不是 nil,但是如果你使用它,你的应用程序会崩溃。不要问我为什么会这样。)

您也可以使用+entityForName:inManagedObjectContext:,正如您所提到的。但请查看该方法的文档:

从与指定托管对象上下文的持久存储协调器关联的托管对象模型中返回具有指定名称的实体。

因此,即使该方法采用托管对象上下文参数,它仍然使用托管对象模型。它使用上下文来查找模型。您获得的对象与上下文无关,它与底层数据模型相关联。

这两种方法同样安全。使用在您的代码中效果最好的那个。

【讨论】:

  • 当您说“如果您在加载模型之前尝试调用此方法”:在典型的 ios 使用中究竟何时加载模型?
  • 我的意思是,如果您尝试在定义实体的NSManagedObjectModel 加载到内存之前调用 [EntityName entity]。该方法仍然存在,但还没有实体信息。如果您使用NSPersistentContainer,则在您调用loadPersistentStores(completionHandler:) 时会加载模型。如果您没有使用NSPersistentContainer,那么您将拥有专门在某处创建NSManagedObjectModel 的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多