Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CoreData—NSManagedObject子类的好处_Ios_Swift_Core Data - Fatal编程技术网

Ios CoreData—NSManagedObject子类的好处

Ios CoreData—NSManagedObject子类的好处,ios,swift,core-data,Ios,Swift,Core Data,我试图在不创建NSManagedObject子类的情况下插入CoreData。但我的应用程序在类别中的NSManagedObject setValue:forUndefinedKey“name”时崩溃 let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext let entitiyDesc = NSEntityDescri

我试图在不创建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()

将NSManagedObject子类化的好处是什么?

将NSManagedObject子类化可以让开发人员的生活更轻松

  • 无需与
    setValue:forUndefinedKey
    争论
  • 每个实体的简易初始化器
  • 使用Xcode自动生成的模型更容易管理实体

您应该查看or以开始使用。

使用核心数据的方式没有问题。通常,在以下情况下,您开始想要子类化:

  • 您希望在
    NSManagedObject
  • 您使用的是根本不在模型中的瞬态值
  • 想要对创建或插入
    NSManagedObject
  • 想要向UI开发人员展示一个更易于使用的对象吗
  • 要避免在访问属性时使用“魔术字符串”吗
我相信在这个列表中还有更多

您永远不需要
NSManagedObject
进行子类化,但在许多情况下,它确实会使代码更干净,更易于维护

关于您的代码的几点注释:

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

Marcus Zarra的答案是100%正确的,但我想强调的是,考虑到“未定义键”和类型转换错误的风险,以及调试成本,同时记住哪些实体具有哪些属性键,是否子类甚至不应该是一个选择

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

如果您不熟悉核心数据,请允许我向您介绍我编写的库,该库主要围绕Swift的类型安全设计:

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

您还可以获得强大的功能,如事务、渐进式迁移等。它就像训练轮上的核心数据;如果在核心数据中存在不好的做法,CoreStore很可能首先不让您编写该代码。

请投票支持关于依赖项注入的评论。多年来,与您的AppDelegate的耦合对我来说很艰难。谢谢您Marcus的支持。我很荣幸得到你的答复。我已经在从cimgf学习核心数据了。我正在尝试在我的网络库中添加对核心数据的支持-。你能帮我找出坠机的原因吗?错误是什么?你有问题的链接吗?此时应用程序崩溃了-managedObject.setValue(d.name,forKey:“name”)。@RahulKatariya你应该打开一个新问题并发布完整错误。仅仅说“it崩溃”并不能给任何人提供足够的信息来帮助您。我不建议人们将核心数据打包到第三方库中。他们学习核心数据本身要比从已经是抽象的东西中抽象出来要好得多。IMO学习像CoreData这样的大型框架的最快方法是吸收其他人(包括包装库)的最佳实践。当其他人已经解决了这些问题时,为什么还要浪费时间陷入核心数据陷阱呢?他们仍然可以在不牺牲生产力的情况下学习核心数据。核心数据并不庞大,而将其包装以隐藏是向后的。很多人都不同意我的观点,认为这是每个人都写的所有包装纸的证据,但这些包装纸确实不是必要的,它们往往隐藏问题或引入更多的问题,而不是试图解决的问题。