【问题标题】:CoreData - Benefits of NSManagedObject SubclassCoreData - NSManagedObject 子类的好处
【发布时间】:2016-04-28 13:47:06
【问题描述】:

我试图在不创建 NSManagedObject 子类的情况下插入 CoreData。但我的应用程序因 NSManagedObject setValue:forUndefinedKey "name" 在 Category 中崩溃。

    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 有什么好处

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

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

    • 您希望在NSManagedObject 上使用方便的方法
    • 您正在使用模型中根本没有的瞬态值
    • 想要对NSManagedObject 的创建或插入做出反应
    • 希望向您的 UI 开发人员展示一个更易于使用的对象
    • 希望在访问属性时避免使用“魔术字符串”

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

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

    您的代码中有几个 cmets:

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

    【讨论】:

    • 支持关于依赖注入的评论。多年来,与您的 AppDelegate 的耦合对我来说一直很艰难。
    • 感谢马库斯的积分。很荣幸收到您的回复。我已经在从 cimgf 学习核心数据了。我正在尝试在我的网络库中添加对 Core Data 的支持 - github.com/Restofire/Restofire。你能帮我找出崩溃的原因吗?
    • @RahulKatariya 什么是崩溃?错误是什么?你有问题的链接吗?
    • 此时应用程序崩溃 - managedObject.setValue(d.name, forKey: "name")。
    • @RahulKatariya 您应该打开一个新问题并发布完整的错误。仅仅说“它崩溃了”并不能为任何人提供足够的信息来帮助您。
    【解决方案2】:

    继承 NSManagedObject 确实让您作为开发人员的生活更轻松。

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

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

    【讨论】:

      【解决方案3】:

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

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

      如果您是 Core Data 的新手,让我向您介绍我编写的库 CoreStore,它是围绕 Swift 的类型安全性进行大量设计的:

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

      您还可以获得强大的功能,例如事务、渐进式迁移等。这就像训练轮上的核心数据;如果在 Core Data 中有不好的做法,CoreStore 很可能一开始就不会让你编写该代码。

      【讨论】:

      • 我不建议人们将 Core Data 包装在第三方库中。他们学习核心数据本身比从已经是抽象的东西中抽象出来更好。
      • IMO 学习像 CoreData 这样庞大的框架的最快方法是吸收其他人的最佳实践(包括包装器库)。当其他人已经解决了这些问题时,为什么还要浪费时间陷入 Core Data 陷阱?他们仍然可以在不牺牲生产力的情况下学习核心数据。
      • 核心数据并不庞大,将其包装以隐藏它是向后的。很多人不同意我作为每个人都写的所有包装的证据,但它们确实没有必要,并且倾向于隐藏问题或引入比他们试图解决的更多的问题。
      猜你喜欢
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2013-03-30
      相关资源
      最近更新 更多