我有一个类有这样的方法:
- (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
中。
非常感谢。
答案 0 :(得分:0)
似乎问题不在方法中,而是我在AppDelegate
中初始化上下文:在调用问题中的方法之前,在某些情况下我是第一次从队列中检索上下文那不是主线程,这似乎导致上下文在其他队列中初始化。