2014-05-09 32 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

沒有我不使用保存通知更改合併到另一個孩子,我只將其用於更改合併到母公司,例如保存主要背景的孩子上下文將觸發保存通知,在那個時候,我會合並更改爲主要背景,並保存它,這個實習生會保存父母的通知,那時我會將更改合併到父私人上下文中 –

相關問題