gpt4 book ai didi

iphone - iPhone 静态库中的核心数据

转载 作者:行者123 更新时间:2023-12-03 18:12:26 26 4
gpt4 key购买 nike

我构建了一个大量使用 Core Data 框架的静态库。我可以在外部项目中成功使用该库,但前提是我在主项目中包含 .xcdatamodel 文件。这不太理想,因为该库的目的是尽可能隐藏实现细节。

在单独的question中,我被告知我不能将资源与库捆绑在一起(现在这对我来说完全有意义)。

那么有没有一种方法可以以编程方式允许“发现”模型,而不必将模型包含在主项目中?

最佳答案

萨沙的回答让我走上了正轨。将静态库中已编译的 .mom 文件合并到宿主项目中的 .mom 文件相对简单。这是一个简单的例子:

  1. 创建新的 XCode 静态库项目名为 MyStaticLibrary

  2. MyStaticLibrary 中创建一个名为 MyStaticLibraryModels.xcdatamodel 的 .xcdatamodel 文件,添加一些 Entity,然后生成 header 和实现。构建 MyStaticLibrary 目标时,您将生成一个 libMyStaticLibrary.a 二进制文件,但它不会包含已编译的 .mom 文件。为此,我们必须创建一个 bundle 。

  3. 创建一个 Loadable Bundle 类型的新构建目标(位于 MacOS X > Cocoa 下),我们将新目标命名为 MyStaticLibraryModels

  4. MyStaticLibraryModels.xcdatamodel 拖到 MyStaticLibraryModels 目标的 Compile Sources 构建阶段。当您构建 MyStaticLibraryModels 目标时,您将生成一个名为 MyStaticLibraryModels.bundle 的文件,它将包含已编译的 NSManagedObjectModel 文件,MyStaticLibraryModels .妈妈.

  5. 构建 MyStaticLibraryMyStaticLibraryModels 目标后,拖动 libMyStaticLibrary.a(以及任何关联的模型头文件)并MyStaticLibraryModels.bundle 到您的宿主项目 MyAwesomeApp 中。

  6. MyAwesomeApp 使用 CoreData,有自己的 .xcdatamodel 文件,该文件将在其自己的构建过程中编译成 .mom 文件过程。我们希望将此 .mom 文件与我们在 MyStaticLibraryModels.bundle 中导入的文件合并。在 MyAwesomeApp 项目中的某个位置,有一个方法返回 MyAwesomeAppNSManagedObjectModel。 Apple 为此方法生成的模板如下所示:

...

- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel_ != nil) {
return managedObjectModel_;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyAwesomeApp" withExtension:@"momd"];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedObjectModel_;
}

我们将对此进行更改,以将 NSManagedObjectModelMyAwesomAppMyStaticLibraryModels 合并并返回,作为单个组合的 NSManagedObjectModel 像这样:

- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel_ != nil) {
return managedObjectModel_;
}

NSMutableArray *allManagedObjectModels = [[NSMutableArray alloc] init];

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyAwesomeApp" withExtension:@"momd"];
NSManagedObjectModel *projectManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
[allManagedObjectModels addObject:projectManagedObjectModel];
[projectManagedObjectModel release];

NSString *staticLibraryBundlePath = [[NSBundle mainBundle] pathForResource:@"MyStaticLibraryModels" ofType:@"bundle"];
NSURL *staticLibraryMOMURL = [[NSBundle bundleWithPath:staticLibraryBundlePath] URLForResource:@"MyStaticLibraryModels" withExtension:@"mom"];
NSManagedObjectModel *staticLibraryMOM = [[NSManagedObjectModel alloc] initWithContentsOfURL:staticLibraryMOMURL];
[allManagedObjectModels addObject:staticLibraryMOM];
[staticLibraryMOM release];

managedObjectModel_ = [NSManagedObjectModel modelByMergingModels:allManagedObjectModels];
[allManagedObjectModels release];

return managedObjectModel_;
}

这将返回合并后的 NSManagedObjectModel 以及来自 MyAwesomeAppMyStaticLibraryEntity

关于iphone - iPhone 静态库中的核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1711586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com