据我所知,可以在私有队列中创建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;
}
答案 0 :(得分:0)
在你的情况下很难发现什么会引发异常 - 信息太少了。
乍一看一切似乎都很好,但是 - 请注意按照以下顺序设置您的父/子上下文:
persistentStoreCoordinator
parentContext
设置为根上下文在您的情况下,可能会由于以下原因引起异常:
mainContext
是nil
mainContext
' persistentStoreCoordinator
nil
无论如何,最快的解决方案将是CoreData触发的日志异常。您可以使用NSSetUncaughtExceptionHandler
编辑1:
要始终如一地尝试在NSManagedObjectContext *mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
而不是AppDelegate
的初始化方法中使用alloc/init
,但这很可能不是解决问题的方法。再一次,在控制台中阅读异常消息 - 这将准确地说明出了什么问题。