Fore xcode 加载包

Posted

技术标签:

【中文标题】Fore xcode 加载包【英文标题】:Fore xcode to load bundle 【发布时间】:2013-09-09 12:36:47 【问题描述】:

核心数据模型位于添加到主项目的捆绑包中。现在我必须将核心数据迁移到更新的模型。我一直在关注一些示例like this,所以我想在任何查询或导入发生之前迁移数据库。所以我将代码放在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中,但当时没有加载包含核心数据模型的包。拿到捆绑包说它还没有加载。所以我无法开始迁移过程。

我怎样才能强制它加载这个包?

将核心数据模型放在一个单独的包中而不是主包中是一种好方法吗?

编辑:

- (NSManagedObjectModel*)objectModel

if (_objectModel)
    return _objectModel;

    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:kDataManagerBundleName ofType:@"bundle"];
    NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"];
_objectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];

return _objectModel;

对于迁移部分,它表示包尚未加载并为 pathForResource 返回 nil。

【问题讨论】:

【参考方案1】:

您可以使用NSBundle 方法load 强制加载捆绑包(docs here)。编辑:正如你所说,这仅适用于可执行代码,不适用于资源。

关于将 CoreData 模型放在单独的包中,如果您想在多个应用程序中重用该模型(和/或任何其他资源),这是一种常见的做法。如果您不希望这样,则没有理由拥有单独的捆绑 IMO。

【讨论】:

感谢您的回答。 load 用于加载可执行代码。我正在寻找加载核心数据模型(momd 文件)。 你是对的 - 刚刚编辑了我的答案。您能否将代码的 sn-p 粘贴到您正在创建包和模型的位置? 模型和包是用 xcode 创建的。模型被添加到包中,并且包被添加到目标中。我这边没有代码。 但我想您正在调用 bundleWithURL: 或 bundleForPath: (创建捆绑对象),然后还以某种方式创建托管对象模型...您可以复制粘贴该代码吗? 我刚刚发布了那部分。那部分确实有效。我的意思是我可以读取和保存数据,其中一些读取发生在应用程序中并通过选项启动。【参考方案2】:

我最终将数据模型移动到主包中,因为启动时无法加载资源包。

【讨论】:

以上是关于Fore xcode 加载包的主要内容,如果未能解决你的问题,请参考以下文章

Xcode11 应用程序加载器

Xcode 不从 CUIDatalog 加载图像

Xcode 8 在加载时挂起

XCode 8在加载时挂起

Xcode 7.2 不加载通过 Cocoapods 安装的库中的类

由于意外错误,无法加载测试包