2013-02-10 77 views
4

我有以下結構理解嵌套上下文

持久性存儲< - >父上下文< - > MOC(上主線程)< - >後臺線程MOC (MOC =管理對象上下文)

這樣的IM做的一個關於背景方面

// Create a background context. 
NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
context.parentContext = self.document.managedObjectContext; 
// Start using it, but in its own thread! 
[context performBlock:^ 
{... 

一些工作,我從表中獲取一些對象,並刪除其中的一些上下文。

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"User"]; 
NSArray* userQueryResults = [context executeFetchRequest:request error:&error]; 
for (int i = 0; i < userQueryResults.count; i++) 
{ 
    if(someCondition) 
    [context deleteObject:[userQueryResults objectAtIndex:bla]; 
} 

現在,說我只想其餘用戶重新提取到一個數組...

將它重新獲取所有原本存在的用戶或只是重新獲取那些沒有刪除的人?

如果我要拯救我的'背景'會有什麼區別嗎?

基本上我試圖理解取之間的差異,並與嵌套上下文節省...

感謝

回答

2

您可以通過設置重新獲取這兩種方式的用戶 - [NSFetchRequest setIncludesPendingChanges]屬性。 默認值爲YES。 如果值爲NO,則取回請求將跳過檢查未保存的更改並僅返回與持久性存儲中的謂詞相匹配的對象。

如果您保存子上下文,它只是將您的更改推送到父上下文中。最後,要查看持久存儲中的更改,您需要保存父上下文。要做到這一點,你可以使用下面的代碼片段:

[context performBlock:^{ 
    NSError* error = nil; 
    [context save:&error]; 
    [self.document.managedObjectContext performBlock:^{ 
     NSError* parentError = nil; 
     [self.document.managedObjectContext save:&parentError]; 
    }]; 
}];