无法将专用队列中的上下文设置为主队列中另一个上下文的子级
Unable to set a context in a private queue as child of another context in main queue
据我所知,可以在私有队列中创建一个 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
中):
NSManagedObjectContext *mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
mainContext.persistentStoreCoordinator = self.managedObjectContext.persistentStoreCoordinator;
NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
privateContext.parentContext = mainContext;
我没有收到任何错误...为什么会发生这种情况? AppDelegate
中提供的默认上下文有什么不能用作父上下文?
编辑 2: AppDelegate
中的上下文我试图设置为父上下文是使用 [=18 中默认提供的方法初始化的=]:
- (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;
}
很难检测到在您的案例中引发异常的原因 - 信息太少。
乍一看一切似乎都很好,但是 - 请注意按以下顺序设置您的 parent/child 上下文:
- 创建根上下文。
- 设置其
persistentStoreCoordinator
- 创建子上下文
- 将其
parentContext
设置为根上下文
- 继续使用 3-4
设置 parent/child 层次结构
在您的情况下,异常可能是由于:
mainContext
是 nil
mainContext
的persistentStoreCoordinator
是nil
无论如何,最快的解决方案是由 CoreData 触发的日志异常。您可以使用 NSSetUncaughtExceptionHandler
编辑 1:
为了始终如一地尝试在 AppDelegate
的初始化方法中使用 NSManagedObjectContext *mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
而不是 alloc/init
,但这很可能无法解决问题。再次,阅读控制台中的异常消息 - 这将准确了解问题所在。
据我所知,可以在私有队列中创建一个 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
中):
NSManagedObjectContext *mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
mainContext.persistentStoreCoordinator = self.managedObjectContext.persistentStoreCoordinator;
NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
privateContext.parentContext = mainContext;
我没有收到任何错误...为什么会发生这种情况? AppDelegate
中提供的默认上下文有什么不能用作父上下文?
编辑 2: AppDelegate
中的上下文我试图设置为父上下文是使用 [=18 中默认提供的方法初始化的=]:
- (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;
}
很难检测到在您的案例中引发异常的原因 - 信息太少。
乍一看一切似乎都很好,但是 - 请注意按以下顺序设置您的 parent/child 上下文:
- 创建根上下文。
- 设置其
persistentStoreCoordinator
- 创建子上下文
- 将其
parentContext
设置为根上下文 - 继续使用 3-4 设置 parent/child 层次结构
在您的情况下,异常可能是由于:
mainContext
是nil
mainContext
的persistentStoreCoordinator
是nil
无论如何,最快的解决方案是由 CoreData 触发的日志异常。您可以使用 NSSetUncaughtExceptionHandler
编辑 1:
为了始终如一地尝试在 AppDelegate
的初始化方法中使用 NSManagedObjectContext *mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
而不是 alloc/init
,但这很可能无法解决问题。再次,阅读控制台中的异常消息 - 这将准确了解问题所在。