我在我的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方法调用创建 new defaultContext是否明智?
答案 0 :(得分:1)
并在AppDelegate.m中进一步
defaultContext = [NSManagedObjectContext MR_defaultContext];
......这可能是AOK,因为你很可能在主线上。
在整个应用程序中使用它。
...这不太好,因为“整个应用程序”意味着您可能在而不是主线程。
您可能希望在特定位置使用[NSManagedObjectContext MR_contextForCurrentThread]
。
查看MagicalRecord中的[NSManagedObjectContext MR_defaultContext]
和[NSManagedObjectContext MR_contextForCurrentThread]
做什么(在您的代码中输入,然后通过cmd点击它以便快速找到它)。您将看到MR_contextForCurrentThread
在主线程上使用defaultContext ,并在其他线程上创建一个新的上下文作为defaultContext的上下文。