在 Pod 中使用CoreData,打包.xcdatamodel

2020-01-11  本文已影响0人  我取的这个名字简直不要太长了吧

一、将.xcdatamodel置于Classes同级目录

xcdatamodel位置

二、配置spec文件

Pod::Spec.new do |s|
  s.name             = 'MyLib'
  s.version          = '0.1.3'
  s.summary          = 'a Lib'
  #设置资源路径
  s.resource = 'MyLib/CoreData.xcdatamodel'
end

将资源指定为 'MyLib/*.xcdatamodel',pod 会自动打包进framework文件夹:


xxx.mom

如果使用 resource_bundles,pod 会打包xcdatamodel文件打包在一个同名的bundle中

  core.resource_bundles = {
     'MyLib' => ['MyLib/CoreData.xcdatamodel']
   }

三、xcdatamodel在framework中的路径

lazy var managedObjectModel: NSManagedObjectModel = {
        let bundle = Bundle.init(for: self.classForCoder)
        let modelURL = bundle.url(forResource: "CoreData", withExtension: "mom")
        let managedObjectModel = NSManagedObjectModel.init(contentsOf: modelURL!)
        return managedObjectModel!
   }()

注意!!!Bundle.init(for: self.classForCoder)这里实在pod中使用CoreData.xcdatamodel的路径。如果在外部引用,则路径应该是:

let modelURL = Bundle.main.url(forResource: "Frameworks/MyLib.framework/CoreData", withExtension: "mom")

四、Pod中不能引用CoreData实体类问题

由于CoreData是在运行时自动生成实体类,所以实体类的Target Menbership并没有选中当前的framework,所以在本pod 中无法直接使用。
1、选择手动生成实体类,Codegen 选中Manual/None
2、将其打包进Pod中。只需要在手动生成实体类时,与其他类一样将路径选在Classes中即可。

如果Codegen 不选择Manual/None,实体类在运行时还是会生成一次,这样就会存在两份相同文件。


image.png

以上。

上一篇 下一篇

猜你喜欢

热点阅读