无法将专用队列中的上下文设置为主队列中另一个上下文的子级

Unable to set a context in a private queue as child of another context in main queue

据我所知,可以在私有队列中创建一个 NSManagedObjectContext 并将其父上下文设置为属于主线程的另一个 NSManagedObjectContext ...不是是吗?

我正在尝试这样做:

NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = appDelegate.managedObjectContext;
[privateContext setParentContext:mainContext]; 

但是当我 运行 这段代码时,我在 [privateContext setParentContext:mainContext] 处遇到 SIGABRT 错误。

我从AppDelegate中获取的mainContext是在主线程中初始化的,这段代码也是在主线程中调用的。我做错了什么或遗漏了什么?

谢谢

编辑: 如果我改为这样做(在 AppDelegate 中):

NSManagedObjectContext *mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
mainContext.persistentStoreCoordinator = self.managedObjectContext.persistentStoreCoordinator;
NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

privateContext.parentContext = mainContext;

我没有收到任何错误...为什么会发生这种情况? AppDelegate 中提供的默认上下文有什么不能用作父上下文?

编辑 2: AppDelegate 中的上下文我试图设置为父上下文是使用 [=18 中默认提供的方法初始化的=]:

- (NSManagedObjectContext *)managedObjectContext
{
   // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
   if (_managedObjectContext != nil) {
       return _managedObjectContext;
   }

   NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
   if (!coordinator) {
       return nil;
   }
   _managedObjectContext = [[NSManagedObjectContext alloc] init];
   [_managedObjectContext setPersistentStoreCoordinator:coordinator];
   return _managedObjectContext;
}

很难检测到在您的案例中引发异常的原因 - 信息太少。

乍一看一切似乎都很好,但是 - 请注意按以下顺序设置您的 parent/child 上下文:

  1. 创建根上下文。
  2. 设置其persistentStoreCoordinator
  3. 创建子上下文
  4. 将其 parentContext 设置为根上下文
  5. 继续使用 3-4
  6. 设置 parent/child 层次结构

在您的情况下,异常可能是由于:

  1. mainContextnil
  2. mainContextpersistentStoreCoordinatornil

无论如何,最快的解决方案是由 CoreData 触发的日志异常。您可以使用 NSSetUncaughtExceptionHandler

编辑 1:

为了始终如一地尝试在 AppDelegate 的初始化方法中使用 NSManagedObjectContext *mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 而不是 alloc/init ,但这很可能无法解决问题。再次,阅读控制台中的异常消息 - 这将准确了解问题所在。