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

Ios 无法将专用队列中的上下文设置为主队列中另一上下文的子上下文,ios,core-data,concurrency,nsmanagedobjectcontext,Ios,Core Data,Concurrency,Nsmanagedobjectcontext,据我所知,可以在专用队列中创建一个NSManagedObjectContext,并将其父上下文设置为属于主线程的另一个NSManagedObjectContext。。。不是吗 我正在尝试这样做: NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; AppDelegate *appDelegat

据我所知,可以在专用队列中创建一个
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
中):

我没有错。。。为什么会发生这种情况?
AppDelegate
中提供的默认上下文有哪些不作为父上下文的内容

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

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

privateContext.parentContext = mainContext;
- (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;
}

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

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

  • 创建根上下文
  • 设置其
    persistentStoreCoordinator
  • 创建子上下文
  • 将其
    parentContext
    设置为根上下文
  • 继续使用3-4设置父/子层次结构
  • 在您的情况下,由于以下原因可能会出现例外情况:

  • mainContext
    nil
  • mainContext
    persistentStoreCoordinator
    nil
  • 无论如何,最快的解决方案是由CoreData引发日志异常。你可以用

    编辑1:


    要保持一致,请尝试使用
    NSManagedObjectContext*mainContext=[[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType]AppDelegate
    而不是
    alloc/init
    中使用code>,但这很可能不是问题的解决方法。同样,请阅读控制台中的异常消息-这将给出错误的确切信息。

    很难检测出在您的情况下引发异常的原因-信息太少

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

  • 创建根上下文
  • 设置其
    persistentStoreCoordinator
  • 创建子上下文
  • 将其
    parentContext
    设置为根上下文
  • 继续使用3-4设置父/子层次结构
  • 在您的情况下,由于以下原因可能会出现例外情况:

  • mainContext
    nil
  • mainContext
    persistentStoreCoordinator
    nil
  • 无论如何,最快的解决方案是由CoreData引发日志异常。你可以用

    编辑1:


    要保持一致,请尝试使用
    NSManagedObjectContext*mainContext=[[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType]AppDelegate
    而不是
    alloc/init
    中使用code>,但这很可能不是问题的解决方法。同样,请阅读控制台中的异常消息-这将准确了解出了什么问题。

    谢谢。我编辑了我的问题,以提供
    mainContext
    的初始化方法,即
    AppDelegate
    中提供的方法,我没有做任何更改
    mainContext
    在我尝试将其设置为父上下文时已经初始化,这可能是因为初始化方法需要任何更改吗?@AppsDev我已编辑了一点答案-再次阅读错误消息plzYou were right,这是我得到的异常消息:
    父NSManagedObjectContext必须使用NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType。
    。谢谢,谢谢。我编辑了我的问题,以提供
    mainContext
    的初始化方法,即
    AppDelegate
    中提供的方法,我没有做任何更改
    mainContext
    在我尝试将其设置为父上下文时已经初始化,这可能是因为初始化方法需要任何更改吗?@AppsDev我已编辑了一点答案-再次阅读错误消息plzYou were right,这是我得到的异常消息:
    父NSManagedObjectContext必须使用NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType。
    。谢谢