我正在与app扩展共享CoreML模型 . Xcode为模型生成快速代码 . 为了在扩展中使用该代码,我还必须在app扩展中包含相同的模型 . 有没有办法在应用程序中只包含一次模型,并在app和extension中使用?
您必须在项目中创建一个共享框架,该框架也包含在应用程序和扩展中 . 您将模型放在框架的资源文件夹中,并且可以通过框架的包创建模型的路径或URL .
编辑:如果您将生成的模型类放在框架中,您生成的模型应自动查找模型数据 . 它从类的包中创建模型URL(请参阅生成的 init 方法):
init
init(contentsOf url: URL) throws { self.model = try MLModel(contentsOf: url) } convenience override init() { let bundle = Bundle(for: MyModel.self) let assetPath = bundle.url(forResource: "MyModel", withExtension:"mlmodelc") try! self.init(contentsOf: assetPath!) }
对于框架中的类, Bundle(for: MarsHabitatPricer.self) 是框架的捆绑包 . 您的框架只需要导出模型的类,以便您可以在应用程序和扩展中使用它 .
Bundle(for: MarsHabitatPricer.self)
另请注意,使用同样生成的 init(contentsOf:) ,您可以从您喜欢的任何地方加载模型 .
init(contentsOf:)
1 回答
您必须在项目中创建一个共享框架,该框架也包含在应用程序和扩展中 . 您将模型放在框架的资源文件夹中,并且可以通过框架的包创建模型的路径或URL .
编辑:如果您将生成的模型类放在框架中,您生成的模型应自动查找模型数据 . 它从类的包中创建模型URL(请参阅生成的
init
方法):对于框架中的类,
Bundle(for: MarsHabitatPricer.self)
是框架的捆绑包 . 您的框架只需要导出模型的类,以便您可以在应用程序和扩展中使用它 .另请注意,使用同样生成的
init(contentsOf:)
,您可以从您喜欢的任何地方加载模型 .