【问题标题】:Is it Possible to put the whole CoreData-Stack in a framework?是否可以将整个 CoreData-Stack 放在一个框架中?
【发布时间】:2016-04-19 12:56:38
【问题描述】:

我有一个非常大的项目,我正在重构会话中。一开始我的想法对我来说听起来不错,但现在我在 git 回滚之前陷入困境和困惑。你们是我最后的机会。

我们已经完成了一个 GUI 应用程序,它显示了一些存在于 CoreData 中的数据。一个后台进程不时从网络中获取数据并将它们放入CoreData中。

所以我得到了请求的东西 -> 推入 CoreData 并

嗯,嗯。不!

我将 Kit.xcdatamodeld 放入新的库项目中。我生成所有模型并将主应用程序中的所有代码添加到库中。我解决了所有问题并开始将第一个基本测试转移到新项目中。

我将 ApplicationDelegate 中的 managedObjectModel 部分放入新项目的 DataController 中。并更改了第一次调用以使用新类中的这个 managedObject。

let dc = DataController()
_ = GlobalScope(context: dc.managedObjectContext!)

当我运行第一个应该存储简单实体的测试时,managedObjectModel 中出现错误:

lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
    let modelURL = NSBundle.mainBundle().URLForResource(" <LibName>Kit", withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
}()

fatal error: unexpectedly found nil while unwrapping an Optional value

我的问题是:是否可以将整个 CoreData 的东西放入一个框架中?我的 gui 应用程序中没有任何数据模型或请求?计划包括框架并使用我的模型的 getXY() setXY() 函数。整个网络的背景提取也应该放在框架中。 但似乎框架中没有 mainBundle 。那么如何正确获取数据库呢?

非常感谢。 ps

【问题讨论】:

  • 这是框架还是静态库?
  • 嘿,一个框架
  • 在使用框架时要小心使用哪个包 - main bundle 将引用您的例如main abc.app,而不是其中包含的框架。在那里你可能想使用类的框架等。

标签: swift macos cocoa core-data


【解决方案1】:

首先,Core Data 已经是一个框架。您希望将核心数据之上的层放入框架中。是否可以?可能,但这不是一个好主意。

将应用程序的三分之一(或更多)放入框架没有任何价值。它不会使任何事情变得更清洁或更容易。事实上,它会使您的应用程序的调试更加困难。

使用 Xcode 中的组分离代码并在那里调用它。试图把东西放到单独的 Xcode 项目中(这是你需要的)会导致更多的问题而不是它的价值。

顺便说一句,没有办法将模型编译到框架中,因为这是一个独立的文件。因此,您的主应用程序无论如何都需要嵌入模型文件。

您可以探索创建自己的自定义 CocoaPod 类结构,但同样不值得,并且可维护性会降低。

【讨论】:

  • 我反对。我们通常将产品分成较小的项目,并将其全部放入工作区。效果很好,对构建应用程序的分层有很大帮助,而且我们从未遇到过任何有关调试的问题。 Monster 项目 恕我直言,与 monster 视图控制器 一样糟糕。只是我的 2c。
  • Marcus,我明白你的意思,但我们拥有相同的数据模型和在该模型上运行的相同功能,这构成了我们应用程序的近 70%。剩下的就是图形用户界面了。我们计划发布 GUI 的第二个和第三个版本。不同的方法,相同的数据模型和该模型上的相同操作功能。不要将这些部分分成不同的项目现在会在未来杀死我们,我预测。问题是,如何实现使用 CoreData 的可测试框架?没有主应用如何实现managedObjectModel?
  • Jay,你能给我举个例子吗?如果没有主应用程序,我无法让 managedObjectModel 工作......完全混乱,或者完全走错了轨道。
  • 如果你想在项目之间共享代码,那么 git 子模块是一个更好的答案。构建一个框架,单独的二进制文件,是一个坏主意。它可以完成,但它会导致一个噩梦般的项目。我经常在代码库中重复使用网络层,并且使用 git 子模块完全可以满足您的需要。代码是共享的,它被编译到主二进制文件中,一切运行顺利。
【解决方案2】:

问题出在这一行:

let modelURL = NSBundle.mainBundle().URLForResource(" <LibName>Kit", withExtension: "momd")!

它正在主包中查找该资源,但该资源不存在。您需要改用 bundleWithIdentifier 或 bundleForClass,例如:

let modelURL = NSBundle(identifier:"com.whatever.yourFrameworkIdentifier").URLForResource...

【讨论】:

    猜你喜欢
    • 2018-06-13
    • 2016-10-22
    • 1970-01-01
    • 2010-10-18
    • 2011-03-31
    • 2017-08-08
    • 2011-04-18
    • 1970-01-01
    • 2013-08-24
    相关资源
    最近更新 更多