Ios 上下文已经有了一个协调器;无法取代
在执行我的应用程序时,我收到错误“由于未捕获的异常'NSInternalInconsistencyException'终止应用程序”,原因:“上下文已具有协调器;无法替换”。” 在DataBaseManager.m中,我有以下代码:Ios 上下文已经有了一个协调器;无法取代,ios,objective-c,core-data,Ios,Objective C,Core Data,在执行我的应用程序时,我收到错误“由于未捕获的异常'NSInternalInconsistencyException'终止应用程序”,原因:“上下文已具有协调器;无法替换”。” 在DataBaseManager.m中,我有以下代码: AppDelegate *sharedDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSManagedObjectContext *privateW
AppDelegate *sharedDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *privateWriterContext = [sharedDelegate privateWriterContext];
NSManagedObjectContext *context = [sharedDelegate managedObjectContextChild];
context.parentContext = privateWriterContext;
NSManagedObjectContext *contextforThread = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
contextforThread.parentContext = context;
[contextforThread performBlock:^{
//things to do in background
NSError *error;
if (![contextforThread save:&error])
{
// handle error
}
[context performBlock:^{
NSError *error;
if (![context save:&error])
{
// handle error
}
[privateWriterContext performBlock:^{
NSError *error;
if (![privateWriterContext save:&error])
{
// handle error
}
}];
}];
}];
- (NSManagedObjectContext *)managedObjectContextChild
{
if (_managedObjectContextChild != nil) {
return _managedObjectContextChild;
}
_managedObjectContextChild = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
return _managedObjectContextChild;
}
- (NSManagedObjectContext *)privateWriterContext
{
if (_privateWriterContext != nil) {
return _privateWriterContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_privateWriterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_privateWriterContext setPersistentStoreCoordinator:coordinator];
}
return _privateWriterContext;
}
在appDelegate.m中,我有以下代码:
AppDelegate *sharedDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *privateWriterContext = [sharedDelegate privateWriterContext];
NSManagedObjectContext *context = [sharedDelegate managedObjectContextChild];
context.parentContext = privateWriterContext;
NSManagedObjectContext *contextforThread = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
contextforThread.parentContext = context;
[contextforThread performBlock:^{
//things to do in background
NSError *error;
if (![contextforThread save:&error])
{
// handle error
}
[context performBlock:^{
NSError *error;
if (![context save:&error])
{
// handle error
}
[privateWriterContext performBlock:^{
NSError *error;
if (![privateWriterContext save:&error])
{
// handle error
}
}];
}];
}];
- (NSManagedObjectContext *)managedObjectContextChild
{
if (_managedObjectContextChild != nil) {
return _managedObjectContextChild;
}
_managedObjectContextChild = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
return _managedObjectContextChild;
}
- (NSManagedObjectContext *)privateWriterContext
{
if (_privateWriterContext != nil) {
return _privateWriterContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_privateWriterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_privateWriterContext setPersistentStoreCoordinator:coordinator];
}
return _privateWriterContext;
}
Xcode显示该行
context.parentContext = privateWriterContext;
当错误发生时。
如何更正此错误?在-(NSManagedObjectContext*)managedObjectContextChild的顶部放置一个断点,然后查看正在使用的NSManagedObjectContext
的其他位置
错误是告诉您它已经有了一个持久的存储协调器,所以这是您的攻击线
您将这些作为单个实例访问,因此应用程序的其他区域需要知道如何处理它们(以及不应做什么!)。您还可以在错误发生之前检查persistentstorecordinator
和parentContext
属性,以帮助了解发生的情况
这并不是什么可怕的事情,使用几个合理放置的断点应该不会太难找到,但是您可能需要考虑如何更仔细地管理各种上下文以解决问题