CoreData - NSManagedObject子类的好处

时间:2016-04-28 13:47:06

标签: ios swift core-data

我试图在不创建NSManagedObject的子类的情况下插入CoreData。但是我的应用程序在类别中与NSManagedObject setValue:forUndefinedKey“name”崩溃。

    let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
    let entitiyDesc = NSEntityDescription()
    entitiyDesc.name = "Category"
    guard let data = model.data else { return }
    for d in data {
        let managedObject = NSManagedObject.init(entity: entitiyDesc, insertIntoManagedObjectContext: managedObjectContext)
        managedObject.setValue(d.name, forKey: "name")
    }
    try! managedObjectContext.save()

子类化NSManagedObjects有什么好处

3 个答案:

答案 0 :(得分:14)

使用Core Data的方式没有任何问题。通常,您在以下时间开始想要子类化:

  • 您需要NSManagedObject
  • 上的便捷方法
  • 您正在使用完全不在模型中的瞬态值
  • 想要对NSManagedObject
  • 的创建或插入作出反应
  • 想要向UI开发人员展示一个更易于使用的对象
  • 想要避免使用"魔术字符串"访问属性时

我确信该列表中还有更多内容。

您永远不会需要来继承NSManagedObject,但在许多情况下,它确实使您的代码更清晰,更易于维护。

对您的代码提出几点意见:

    不应该以这种方式创建
  • NSEntityDescriptionNSManagedObject。您应该使用便捷方法NSEntityDescription.insertNewObjectForEntityForName(_:)而不是
  • 使用这样的强制尝试对于错误处理非常不利。使用do / catch可以更好地 FAR ,这样您就可以完全查询错误。这对于向您发送子错误的核心数据尤其重要。
  • 通过NSManagedObjectContext访问AppDelegate就像是一个糟糕的设计(是的,我知道它在Apple模板中)。如Core Data Programming Guide中所讨论的那样使用依赖注入要好得多,并避免访问AppDelegate所固有的紧密耦合

答案 1 :(得分:1)

诚实地对NSManagedObject进行子类化可以让您的开发人员生活更轻松。

  • 无需麻烦setValue:forUndefinedKey
  • 每个实体的简易初始化程序
  • 使用Xcode自动生成的模型更轻松地管理您的实体

您应该查看official documentationthis tutorial以开始使用。

答案 2 :(得分:1)

Marcus Zarra的回答是100%正确的,但我想强调的是,考虑到未定义键的风险"和输入错误,以及调试成本,同时在心理上记住哪些实体具有哪些属性键,到子类或不应该是一个选择

强调您的NSManagedObject(即通过子类化)也会打开大量的编译时检查和实用程序,尤其是在Swift中。

如果您是Core Data的新手,请允许我向您介绍我编写的库CoreStore,该库是围绕Swift的类型安全设计的:

  • 泛型允许零类型转换
  • 实体感知NSFetchedResultsController - 与观察者一样
  • 基于协议的数据导入

您还可以获得强大的功能,例如交易,渐进式迁移等。它就像训练轮上的核心数据一样;如果Core Data中存在不良做法,CoreStore很可能不会让您首先编写该代码。