0

在我的应用程序中创建推断映射模型(使用 Core Data 的轻量级迁移)时,我遇到了随机崩溃。顺便说一句,我必须在我的应用程序运行时以编程方式执行它。

这就是我创建这个模型的方式(当然,在我制作了正确的 currentModel 和 newModel 对象之后):

NSMappingModel *mappingModel = [NSMappingModel inferredMappingModelForSourceModel:currentModel destinationModel:newModel error:&error];

问题是这样的:此方法随机崩溃。当它工作时,它工作得很好,没有问题。但是当它崩溃时,它会使我的应用程序崩溃(而不是返回 nil 来表示该方法失败,因为它应该)。随机,我的意思是有时会发生,有时不会。这是不可预测的。

现在,这是交易:我在另一个线程中运行这个方法。更准确地说,它位于通过 GCD 传递以在全局主队列上运行的块内。我需要这样做以使我的 UI 对用户来说显得清晰,即这样我就可以在工作进行时显示进度指示器。

奇怪的是,如果我删除 GCD 的东西并让它在主线程上运行,它似乎工作正常并且永远不会崩溃。因此,可能是因为我在另一个线程上运行它而导致崩溃?

我不知何故觉得这很奇怪,因为我不相信我违反了任何关于多线程的 Core Data 规则。特别是,我没有传递任何托管对象,并且每当我需要访问 MOC 时,我都会创建一个新的 MOC,即我不依赖任何之前创建的 MOC(或就此而言:任何东西)在主线程上。除了发生的一些 MOC 东西之外,发生映射模型创建方法之后,即应用程序崩溃的点之后,所以它不可能是这里考虑的崩溃的原因。

我所做的只是获取两个 MOM 并要求它们之间的映射模型。即使在线程下也不会出错,现在可以吗?

关于可能发生的事情有什么想法吗?

4

2 回答 2

0

我最终完全放弃了这个问题,只是自己创建了该死的映射模型。

于 2011-06-03T01:36:53.770 回答
0

首先,什么是崩溃?

其次,Core Data 通常是单线程 API。您可以在多个线程中执行某些操作,但创建 aNSMappingModel很可能不是其中之一。为什么必须动态创建映射模型?如果 MOM 是已知量,则映射也可以是已知量。

更新

首先,线程问题。Core Data 是单线程的。但是,他们NSManagedObjectContext知道如何正确锁定,NSPersistentStoreCoordinator因此每个线程可以有一个NSManagedObjectContext,因为他们知道如何正确锁定。但是,当您使用和创建映射模型时,情况并非如此。

但是,您提供的错误本身并不是核心数据错误。该错误表明您试图在代码中的某处将 nil 放入集合中。在没有看到生成映射模型的代码的情况下,虽然很难猜测到底在哪里。

您是否在 objc_throw_exception 处设置了断点并查看代码中的哪一行导致了此崩溃?如果它是不明显的,那么我建议您在构建映射模型时有某个点给 Core Data 一个意想不到的零。

您可以尝试的一件事是锁定NSPersistentStore和/或您NSManagedObjectContext自己,看看是否可以解决崩溃。但是,我怀疑当您这样做时,您将再次处理性能问题。

于 2010-03-22T02:14:30.633 回答