2017-08-06 69 views
1

我与应用程序扩展程序共享CoreML模型。 Xcode为模型生成swift代码。为了在扩展中使用该代码,我必须在应用程序扩展中包含相同的模型。有没有办法在应用程序中只包含一次模型,并在应用程序和扩展中使用?如何与扩展共享CoreML模型?

回答

0

您必须在您的项目中创建一个共享框架,该框架也包含在应用程序和扩展中。你把模型放在框架的资源文件夹中,你可以在框架的bundle上为模型创建路径或URL。

编辑:如果您将生成的模型类放置在框架中,您生成的模型应自动找到模型数据。它创建从类捆的模型URL(看到生成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)是框架的束。您的框架只需要导出模型的类,以便您可以在应用程序和扩展中使用它。

另请注意,同样生成的init(contentsOf:),您可以从加载您的模型,每个你喜欢。

+0

你能否澄清一下'你可以通过框架的bundle创建模型的路径或url。如何生成swift代码将知道该网址? – Meanteacher

+0

我扩展了我的文章。 – clemens

+0

您是否设法使用嵌入在静态库中的mlmodel进行此项工作? –