Jak*_*kub 7 cocoa-touch core-data ios swift
我正在尝试CoreData在我的Cocoa Touch Framework中使用.我创建一个简单的项目作为示例:https:
//github.com/JakubMazur/SO41698466
基本上我是按步骤做的:
CoreData到项目someDataModelCoreData一些虚拟实体并将模块更改为Current Product ModuleSomeClass开始,它基本上被称为:.
public class func entityCreation() {
Entity(context: CoreDataClass().persistentContainer.viewContext)
}
Run Code Online (Sandbox Code Playgroud)
因此,使用lazy来自CoreData的这个自动生成的代码,这应该创建模型.
.
func testExample() {
SomeClass.entityCreation()
}
Run Code Online (Sandbox Code Playgroud)
CoreDataClass我把断点以下行:
let container = NSPersistentContainer(name: "someDataModel")然后我在控制台中看到:[error]错误:无法加载名为someDataModel CoreData的模型:错误:无法加载名为someDataModel的模型
所以我有两个问题:
NSPersistentContainer名字吗?有一种方法可以检查我应该放在那里?在这里下载项目:https://github.com/JakubMazur/SO41698466
找到并添加解决方案如下
let modelURL = Bundle(for: type(of: self)).url(forResource: "someDataModel", withExtension: "momd")!
let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL)
let container = NSPersistentContainer(name: "someDataModel", managedObjectModel: managedObjectModel!)
Run Code Online (Sandbox Code Playgroud)
Apple建议您NSPersistentContainer在框架中子类化。如果这样做,则将搜索定义子类的框架。
因此,您可以简单地:
final class PersistentContainer: NSPersistentContainer { }
Run Code Online (Sandbox Code Playgroud)
然后使用PersistentContainer而不是NSPersistentContainer在您的框架中。
在name初始化只在主束搜索。
要在其他框架中找到托管对象模型,可以按照注释中的建议获取模型URL。
但是,作为替代,您也可以NSPersistentContainer在框架中子类化,然后name初始化程序将起作用。
这是WWDC Core Data Best Practices视频的摘录:
……假设我们要将模型层纳入其自己的框架中。
为此,我们可以在Xcode中创建一个新的框架目标并将代码移入其中。
一切都非常容易,但是当我们将模型移到新目标中时,在内置产品中,目标就从应用程序移到了新框架中,这应该发生,但是现在NSPersistentContainer不知道在哪里可以找到我们的模型不再。
这是因为默认情况下它仅检查主捆绑包。
为什么停在那里?
好吧,对于一个复杂的应用程序而言,搜索所有应用程序捆绑包可能会变得非常缓慢,这并不是您每次堆叠堆栈时都要支付的费用。
我们该如何解决?
好吧,我们可以从框架捆绑包本身中恢复该模型,并使用容器的其他初始化程序之一,就像采用显式托管对象模型的初始化程序一样,但是NSPersistentContainer实际上为您提供了一种方法来更改其搜索的捆绑包。
看,NSPersistentContainer知道何时将其子类化,并且在寻找模型时将使用子类的类型作为提示。
为了利用这一点,我们要做的就是创建一个子类。
它甚至不需要任何内容。
然后,通过容器设置的任何要使用我们模型的代码都可以采用该子类,而持久性容器将代替我们的框架捆绑包中的模型。
https://asciiwwdc.com/2018/sessions/224
| 归档时间: |
|
| 查看次数: |
966 次 |
| 最近记录: |