上下文已经有一个协调员;无法取代

时间:2015-04-08 14:27:40

标签: ios objective-c core-data

我收到错误“由于未捕获的异常终止应用程序'NSInternalInconsistencyException',原因:'上下文已经有一个协调器;无法替换。'”执行我的应用程序时。

在DataBaseManager.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
            }
        }];
    }];
}];

并在appDelegate.m中我有以下代码:

- (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;

发生错误时。 我怎么能纠正这个错误?

1 个答案:

答案 0 :(得分:-1)

- (NSManagedObjectContext *)managedObjectContextChild的顶部放置一个断点,看看NSManagedObjectContext正在使用的其他地方。

错误告诉您它已经拥有持久存储协调器,因此这是您的攻击线。

您正在将这些作为单个实例访问,因此应用程序的其他区域需要知道如何处理它们(以及不应该做什么!)。您还可以在错误发生之前检查persistentStoreCoordinatorparentContext属性,以帮助了解正在发生的事情。

没有什么可怕的,也不应该用一些明智的断点来找到它们,但是你可能不得不考虑如何更仔细地管理各种情况以解决问题。 / p>