【发布时间】:2018-01-13 19:35:36
【问题描述】:
我正在与应用扩展共享 CoreML 模型。 Xcode 为模型生成 swift 代码。为了在扩展中使用该代码,我还必须在应用扩展中包含相同的模型。有没有办法在应用程序中只包含一次模型,并在应用程序和扩展程序中使用?
【问题讨论】:
我正在与应用扩展共享 CoreML 模型。 Xcode 为模型生成 swift 代码。为了在扩展中使用该代码,我还必须在应用扩展中包含相同的模型。有没有办法在应用程序中只包含一次模型,并在应用程序和扩展程序中使用?
【问题讨论】:
您必须在项目中创建一个共享框架,该框架也包含在应用程序和扩展程序中。您将模型放在框架的资源文件夹中,您可以在框架的捆绑包上创建模型的路径或 url。
编辑:如果您将生成的模型类也放入框架中,您生成的模型应该会自动找到模型数据。它从类的包中创建模型 url(参见生成的 initmethods):
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:),您可以从everywere 加载您喜欢的模型。
【讨论】:
you can create the path or url to the model over the framework's bundle.吗?生成的 swift 代码如何知道 url?