当前位置:  开发笔记 > 运维 > 正文

Cocoa Touch Framework和CoreData

如何解决《CocoaTouchFramework和CoreData》经验,为你挑选了1个好方法。

我正在尝试CoreData在我的Cocoa Touch Framework中使用.我创建一个简单的项目作为示例:https: //github.com/JakubMazur/SO41698466

基本上我是按步骤做的:

    使用单元测试创​​建框架

    添加CoreData到项目someDataModel

    填充CoreData一些虚拟实体并将模块更改为Current Product Module

    然后我创建SomeClass开始,它基本上被称为:

.

public class func entityCreation() {
    Entity(context: CoreDataClass().persistentContainer.viewContext)
}

因此,使用lazy来自CoreData的这个自动生成的代码,这应该创建模型.

    在测试中我写道:

.

func testExample() {
    SomeClass.entityCreation()
}

    并开始测试

    CoreDataClass我把断点以下行: let container = NSPersistentContainer(name: "someDataModel")然后我在控制台中看到:

[error]错误:无法加载名为someDataModel CoreData的模型:错误:无法加载名为someDataModel的模型

所以我有两个问题:

    是否可以在框架内包含Core Data

    如果1为真,我可以使用不同的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!)

josh-fuggle.. 6

TLDR;

Apple建议您NSPersistentContainer在框架中子类化。如果这样做,则将搜索定义子类的框架。

因此,您可以简单地:

final class PersistentContainer: NSPersistentContainer { }

然后使用PersistentContainer而不是NSPersistentContainer在您的框架中。

说明

name初始化只在主束搜索。

要在其他框架中找到托管对象模型,可以按照注释中的建议获取模型URL。

但是,作为替代,您也可以NSPersistentContainer在框架中子类化,然后name初始化程序将起作用。

这是WWDC Core Data Best Practices视频的摘录:

……假设我们要将模型层纳入其自己的框架中。

为此,我们可以在Xcode中创建一个新的框架目标并将代码移入其中。

一切都非常容易,但是当我们将模型移到新目标中时,在内置产品中,目标就从应用程序移到了新框架中,这应该发生,但是现在NSPersistentContainer不知道在哪里可以找到我们的模型不再。

这是因为默认情况下它仅检查主捆绑包。

为什么停在那里?

好吧,对于一个复杂的应用程序而言,搜索所有应用程序捆绑包可能会变得非常缓慢,这并不是您每次堆叠堆栈时都要支付的费用。

我们该如何解决?

好吧,我们可以从框架捆绑包本身中恢复该模型,并使用容器的其他初始化程序之一,就像采用显式托管对象模型的初始化程序一样,但是NSPersistentContainer实际上为您提供了一种方法来更改其搜索的捆绑包。

看,NSPersistentContainer知道何时将其子类化,并且在寻找模型时将使用子类的类型作为提示。

为了利用这一点,我们要做的就是创建一个子类。

它甚至不需要任何内容​​。

然后,通过容器设置的任何要使用我们模型的代码都可以采用该子类,而持久性容器将代替我们的框架捆绑包中的模型。

https://asciiwwdc.com/2018/sessions/224



1> josh-fuggle..:
TLDR;

Apple建议您NSPersistentContainer在框架中子类化。如果这样做,则将搜索定义子类的框架。

因此,您可以简单地:

final class PersistentContainer: NSPersistentContainer { }

然后使用PersistentContainer而不是NSPersistentContainer在您的框架中。

说明

name初始化只在主束搜索。

要在其他框架中找到托管对象模型,可以按照注释中的建议获取模型URL。

但是,作为替代,您也可以NSPersistentContainer在框架中子类化,然后name初始化程序将起作用。

这是WWDC Core Data Best Practices视频的摘录:

……假设我们要将模型层纳入其自己的框架中。

为此,我们可以在Xcode中创建一个新的框架目标并将代码移入其中。

一切都非常容易,但是当我们将模型移到新目标中时,在内置产品中,目标就从应用程序移到了新框架中,这应该发生,但是现在NSPersistentContainer不知道在哪里可以找到我们的模型不再。

这是因为默认情况下它仅检查主捆绑包。

为什么停在那里?

好吧,对于一个复杂的应用程序而言,搜索所有应用程序捆绑包可能会变得非常缓慢,这并不是您每次堆叠堆栈时都要支付的费用。

我们该如何解决?

好吧,我们可以从框架捆绑包本身中恢复该模型,并使用容器的其他初始化程序之一,就像采用显式托管对象模型的初始化程序一样,但是NSPersistentContainer实际上为您提供了一种方法来更改其搜索的捆绑包。

看,NSPersistentContainer知道何时将其子类化,并且在寻找模型时将使用子类的类型作为提示。

为了利用这一点,我们要做的就是创建一个子类。

它甚至不需要任何内容​​。

然后,通过容器设置的任何要使用我们模型的代码都可以采用该子类,而持久性容器将代替我们的框架捆绑包中的模型。

https://asciiwwdc.com/2018/sessions/224

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有