非法访问Core Data上下文:AppDelegate中提供的上下文的所有者是什么线程?

时间:2015-09-26 16:42:46

标签: ios multithreading core-data nsmanagedobjectcontext nsfetchrequest

我有一个类有这样的方法:

- (void)getEntities
{
   AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
   NSManagedObjectContext *mainContext = appDelegate.managedObjectContext;

   NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"];
   NSArray *entities = [mainContext executeFetchRequest:fetchRequest error:nil];

   for (NSManagedObject *item in entities) {
      NSLog(@"Name: %@", ((MyEntity *)item).name);
   }
}

我启用了com.apple.CoreData.ConcurrencyDebug 1,当我调用此方法时(在主线程中)我收到错误:

  

CoreData:错误:当前线程不是此NSManagedObjectContext(0x16d40160)的已识别所有者。在executeFetchRequest期间非法访问:错误:

但是,如果我这样做:

- (void)getEntities
{
   NSManagedObjectContext *privateContext = [CoreDataStack getPrivateContext];

   if (privateContext != nil) {
       [privateContext performBlock: ^{
           NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"];
          NSArray *entities = [privateContext executeFetchRequest:fetchRequest error:nil];

          for (NSManagedObject *item in entities) {
             NSLog(@"Name: %@", ((MyEntity *)item).name);
          }
      }];
   }
}

我也在主线程中调用它,它似乎没有导致这样的Core Data错误......为什么?我一直认为NSManagedObjectContext默认提供的AppDelegate和我检索属于主线程......我做错了什么或者错过了什么?< / p>

我试图使用来自AppDelegate的上下文获取的实体,其中先前已从私有队列中创建的上下文中保存(类似于我在第二个代码段中创建的上下文)。这可能是错误的原因吗?这样的私人环境不是任何其他环境的孩子,保存时我没有错误。

我需要通过在主线程中使用私有上下文来获取我已经存储的实体,以便在NSArray的实现中将它们保存在UIViewController中。

非常感谢。

1 个答案:

答案 0 :(得分:0)

似乎问题不在方法中,而是我在AppDelegate中初始化上下文:在调用问题中的方法之前,在某些情况下我是第一次从队列中检索上下文那不是主线程,这似乎导致上下文在其他队列中初始化。