【问题标题】:Decoupling Core Data解耦核心数据
【发布时间】:2017-04-07 13:19:28
【问题描述】:

我编写的大多数使用 Core Data 的应用程序都遵循通用模式 - 模型类继承自 NSManagedObject,并通过插入到 NSManagedObjectContext 中创建。

由于我正在评估一个新的副项目的几个不同的持久性选项,我很想找到一种方法将核心数据实现与其余代码分开。例如,我可能会改用DataStore 的概念,它是使用协议定义的。它要求任何实现都提供某些功能。例如getCarsaddCardeleteCar。应用程序不需要知道 getCars 是否从 Core Data、Realm、本地文件等获取。

我在使用DataStore 的核心数据实现时遇到的一个直接问题是,一旦将Car 作为实体添加到数据模型中,我就无法创建Car 对象除了通过指定的初始化程序,它期望插入一个上下文。这显然行不通,因为重点是将NSManagedObjectContext 等的任何知识与各种视图控制器和其他类分开。

我正在考虑为我的所有核心数据实体使用其他名称(例如CDCar),然后添加一堆代码来映射到CDCarCar。或者也许为Car 制定一个协议,以便在应用程序中通用,CDCar 将遵守该协议。有没有更常见的方法来解决这个问题?

【问题讨论】:

  • 请记住,通过使用额外的层,例如您的Car 对象,您将失去最强大的CoreData 机制,即faulting 特别是关系船故障。在获取Car 时,您还需要获取Engine 实体、Owner 实体等。您必须为所有相关对象构建图。
  • 谢谢,是的,我没有考虑过。可能会破坏交易。

标签: ios swift core-data


【解决方案1】:

添加一个并行实体会增加很多复杂性,以至于不清楚解耦是否会带来净收益。

我要做的是在 DataStore 类中包含工厂方法以按需创建实例。代替非DataStore 代码直接创建Car,它会在DataStore 上调用新的createCar 方法。 DataStore 做它需要做的任何事情来创建一个有效的实例并返回结果。这可能意味着您不需要addCar,因为您不会在DataStore 之外创建实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2014-12-22
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多