2013-02-10 65 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]; 
    }]; 
}];