2011-08-14 60 views
0

我在Lion中使用了一项新功能,子托管对象上下文用于:“管理可放弃的编辑,例如在检查器窗口或视图中。临时托管对象ID和子托管对象上下文

当我从父MOC传递一个托管对象ID到子MOC时,如果父MOC从未保存过,我会得到一个错误:“尝试访问未在存储中找到的对象。

NSManagedObjectContext *parentContext = [(NSPersistentDocument *)[[[self window] windowController] document] managedObjectContext]; 

self.subMOC = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease]; 

[subMOC setParentContext:parentContext]; 

NSManagedObjectID *objectValueID = [[[self superview] valueForKey:@"objectValue"] objectID]; 

self.subObjectValue = [subMOC existingObjectWithID:objectValueID error:&err]; 

上面的工作很好,如果文档已被保存。如果没有保存,我有什么选择?

回答

2

在MOC保存之前,任何对象ID都是临时的,您必须保存上下文以获取“真实”对象ID。我不知道任何解决方法。

编辑:

我的意思是,很明显,你可以做

if (parentContext.hasChanges) { 
     [panrentContext save:nil]; 
} 
0

答案,而不需要保存,是使用提取请求。此代码,这是非常接近的是在文档中,工作对我来说:

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:subMOC]; 
[request setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self == %@", [[self superview] valueForKey:@"objectValue"]]; 
[request setPredicate:predicate]; 

err = nil; 
NSArray *array = [subMOC executeFetchRequest:request error:&err]; 
if (array != nil) 
{ 
    self.subObjectValue = [array objectAtIndex:0]; 
} 

在项目中,我仍然使用的代码从上面的问题,并仅当没有使用fetch请求。

+0

这不是一个线程安全的方法,如果它担心你。你在这里传递对象。使用托管对象ID是安全的。但是,我坚持你是一样的情况:) –