2014-05-09 29 views
0

我只是想确保做什么是对的!CoreData Multiple NSManagedObjectContext保存通知说明

我用父母子女的NSManagedObjectContext模式,其中

我有一个默认的私有队列的NSManagedObjectContext型NSPrivateQueueConcurrencyType和

我有一个MainQueue的NSManagedObjectContext型NSMainQueueConcurrencyType,其母公司是默认私人队列,

每个视图控制器我将创建一个私有队列上下文与主队列上下文的父母,

它是这样的,

私人情境 - > 主要方面 - > 其他方面

所以我的问题是,这是否设置需要NSManagedObjectContextDidSaveNotification将更改传播到父上下文,否则它将自动冒泡,因为所有其他上下文都是父代和主上下文的子代

因为目前我使用环境保存通知,合并更改和我得到下面的错误很多次

致命异常:NSInternalInconsistencyException 这NSPersistentStoreCoordinator没有持久性存储。它不能执行保存操作。

2 CoreData      0x2f2f44c9 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 3228 
3 CoreData      0x2f315db1 -[NSManagedObjectContext save:] + 824 
4 App      0x000a3279 -[CoreDataManager saveContext:withCompletionBlock:] (CoreDataManager.m:144) 
5 App      0x000a31f9 __46-[CoreDataManager contextDidSaveNotification:]_block_invoke (CoreDataManager.m:134) 
6 CoreData      0x2f3798f9 developerSubmittedBlockToNSManagedObjectContextPerform_privateasync + 68 

回答

0

看起来好像你正在合并通知到另一个子上下文。我怎么会通常做到这一点,

MainViewController

与持久存储协调 主要上下文没有做的比管理孩子方面的任何其他东西。

视图控制器1

有一个孩子被管理对象方面,其母公司为主要背景 您将节省这一点,并推动改变,像这样的主要方面,

[chilContext performBlock:^{ 
    [childContext save:&error]; 
    if(!error){ 
    [childContext.parentContext performBlock:^{ 
    [childContext.parentContext save:&error]; 
    }]; 
    } 
}]; 

视图控制器2

你会从父对象看NSManagedObjectContextDidSaveNotification,如果它发现上下文被保存,它通过合并来自此通知的更改来刷新对象。

- (void)parentContextSaved:(NSNotification*)note{ 
    if(![NSThread isMainThread]){ 
    [self performSelector:@selector(parentContextSaved:) onThread:[NSThread mainThread] withObject:note waitUntilDone:NO]; 
    } 
    [childObjectContext performBlock:^{ 
    [childObjectContext mergeChangesFromContextDidSaveNotification:note]; 
    }]; 
} 

我使用这种方法,这个效果很好。

+0

没有我不使用保存通知更改合并到另一个孩子,我只将其用于更改合并到母公司,例如保存主要背景的孩子上下文将触发保存通知,在那个时候,我会合并更改为主要背景,并保存它,这个实习生会保存父母的通知,那时我会将更改合并到父私人上下文中 –

相关问题