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

时间:2015-09-27 09:37:17

标签: ios core-data concurrency nsmanagedobjectcontext

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

我正在尝试这样做:

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

但是,当我运行此代码时,SIGABRT出现[privateContext setParentContext:mainContext]错误。

我从mainContext检索的AppDelegate在主线程中初始化,此代码片段也在主线程中调用。我能做错什么或错过什么?

由于

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

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

privateContext.parentContext = mainContext;

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

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

- (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;
}

1 个答案:

答案 0 :(得分:0)

在你的情况下很难发现什么会引发异常 - 信息太少了。

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

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

    在您的情况下,可能会由于以下原因引起异常:

    1. mainContextnil
    2. mainContext' persistentStoreCoordinator nil
    3. 无论如何,最快的解决方案将是CoreData触发的日志异常。您可以使用NSSetUncaughtExceptionHandler

      编辑1:

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