致命异常:NSInternalInconsistencyException上下文已经有一个协调器。无法取代

时间:2019-05-13 06:21:44

标签: ios objective-c core-data

CoreData中,在处理背景和主要背景时,我遇到了问题

  

上下文已经有一个协调器;无法替换。”

我正在使用背景队列对主上下文进行读操作,同时对背景上下文进行写操作。你能建议我在这里做错了吗

================================================ =======================

Fatal Exception: NSInternalInconsistencyException
Context already has a coordinator; cannot replace.

@interface CoreDataCustomClass()

@property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong) NSManagedObjectContext *mainContext;
@property (nonatomic, strong) NSManagedObjectContext *backgroundContext;
@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;

@end

static CoreDataCustomClass *sharedInstance = nil;

@implementation CoreDataCustomClass

+(CoreDataCustomClass *)sharedInstance
{
    @synchronized([CoreDataCustomClass class])
    {
        if (!sharedInstance)
        {
            sharedInstance = [[self alloc] init];

        }
        return sharedInstance;
    }
    return nil;
}

#pragma mark - Core Data stack


- (NSManagedObjectContext *)mainContext {

    if (_mainContext.persistentStoreCoordinator)  {
        return _mainContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        __weak __typeof(self)weakSelf = self;
        _mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_mainContext performBlockAndWait:^{
            __strong __typeof(weakSelf)strongSelf = weakSelf;
            [strongSelf->_mainContext setPersistentStoreCoordinator:coordinator];
        }];
    }

    return _mainContext;
}


-(void)saveMainContext {

    NSManagedObjectContext *mainManagedObjectContext = self.mainContext;


    [mainManagedObjectContext performBlock:^{
        NSError *error = nil;
        if ([mainManagedObjectContext hasChanges] && ![mainManagedObjectContext save:&error])
        {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        }

        [mainManagedObjectContext performBlock:^{
            NSError *error = nil;
            if ([mainManagedObjectContext hasChanges] && ![mainManagedObjectContext save:&error])
            {
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            }
        }];
    }];
}

-(NSManagedObjectContext *)backgroundContext{

    if (_backgroundContext.persistentStoreCoordinator){
        return  _backgroundContext;
    }
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if(coordinator != nil){
         __weak __typeof(self)weakSelf = self;
        _backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [_backgroundContext performBlockAndWait:^{
             __strong __typeof(weakSelf)strongSelf = weakSelf;
            [strongSelf->_backgroundContext setPersistentStoreCoordinator:coordinator];
            [strongSelf->_backgroundContext setUndoManager:nil];
        }];
    }
    return _backgroundContext;
}

-(void)saveBackgroundContext {

    NSManagedObjectContext *backgrounManagedObjectContext = self.backgroundContext;


    [backgrounManagedObjectContext performBlock:^{
        NSError *error = nil;
        if ([backgrounManagedObjectContext hasChanges] && ![backgrounManagedObjectContext save:&error])
        {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        }

        [backgrounManagedObjectContext performBlock:^{
            NSError *error = nil;
            if ([backgrounManagedObjectContext hasChanges] && ![backgrounManagedObjectContext save:&error])
            {
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            }
        }];

    }];
}

- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"abc" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSDictionary *persistentOptions = @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES};
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"abc.sqlite"];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {

        [[NSFileManager defaultManager] removeItemAtURL: storeURL error: nil];
        if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration: nil URL: storeURL options: nil error: &error])
        {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        }
    }


    NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];
    if (![[NSFileManager defaultManager] setAttributes:fileAttributes ofItemAtPath:[storeURL path] error:&error]) {
        NSLog(@"error");
    }

    return _persistentStoreCoordinator;
}

0 个答案:

没有答案