1

我在整个 iPad 应用程序中都使用 MagicalRecord;我有一行代码,间歇性地抛出一个异常:

+entityForName: nil 不是搜索实体名称的合法 NSManagedObjectContext 参数...

我理解是因为 NSManagedObjectContext 是nil。该应用程序运行了很长一段时间,直到此代码行和其他类似代码(使用不同的实体)触发错误:

    [apptDataArray addObjectsFromArray:[AppointmentInfo MR_findAllWithPredicate:predicate]];

NSManagedObjectContext 在 AppDelegate.h 中定义为

NSManagedObjectContext *defaultContext;

并在 AppDelegate.m 中进一步作为

    defaultContext = [NSManagedObjectContext MR_defaultContext]; 

它在整个应用程序中使用。在我问过的另一个 SO 问题中,Saul Mora 是这样说的:

通过每次保存时创建一个新的上下文,而不是重新使用上下文,您将保证不会跨线程,并且不会在 1% 的时间内使您的应用程序崩溃。

会不会是我的保存以某种方式破坏了defaultContext对象?如果是这样,为每个 MR 方法调用创建一个新的 defaultContext 是否明智?

4

1 回答 1

1

并在 AppDelegate.m 中进一步作为

defaultContext = [NSManagedObjectContext MR_defaultContext]; 

...这可能是 AOK,因为您可能在主线程上。

它在整个应用程序中使用。

...这不太好,因为“整个应用程序”意味着您可能不在主线程上。

您可能想[NSManagedObjectContext MR_contextForCurrentThread]在特定的地方使用。

看看MagicalRecord中的内容[NSManagedObjectContext MR_defaultContext]和操作(在代码中输入,然后 cmd-click 以快速找到它)。[NSManagedObjectContext MR_contextForCurrentThread]您将看到它在主线程上MR_contextForCurrentThread使用了 defaultContext ,并在其他线程上创建了一个以 defaultContext 为父级的新上下文。

于 2014-04-19T16:15:22.447 回答