0

这是在后台线程上。它是一个私有并发类型上下文,它在上下文 performBlock 中执行。我做得对,至少我认为我是。

我不是核心数据的初学者,但是我可能会遗漏一些明显的东西——因为我一直在盯着它看。

这是代码:

FFXCollection *backgroundCollection = (FFXCollection *) [context objectWithID:collectionID];

//At this point backgroundCollection.managedObjectContext is the same as context

NSError *error = nil;
[context save:&error];
NSLog(@"error %@", error); //Note that there is no error here

if (!backgroundCollection.managedObjectContext) {
DLog(@"why not?"); //At this point the managedObjectContext is nil!!!
}

为什么 managedObjectContext 在托管对象中变为 nil ?

该示例是人为的,但说明了我的问题。在我的实际代码中,发生了保存,然后我尝试建立关系。然后,当另一个保存发生时,由于上述原因,我得到了一个验证错误。

谢谢

4

1 回答 1

1

请改用现有的ObjectWithID。

existingObjectWithID:error: 返回指定 ID 的对象。

  • (NSManagedObject *)existingObjectWithID:(NSManagedObjectID )objectID 错误:(NSError * )error 参数 objectID 请求对象的对象 ID。错误 如果在检索由 objectID 指定的对象时出现问题,则返回时包含描述问题的错误。返回值 objectID 指定的对象。如果对象无法获取、不存在或无法出错,则返回 nil。

讨论 如果已经在上下文中注册了具有给定 ID 的托管对象,则直接返回该对象;否则相应的对象将错误地进入上下文。

如果数据未缓存,此方法可能会执行 I/O。

与 objectWithID: 不同,此方法从不返回错误

可用性 适用于 OS X v10.6 及更高版本。另见 – objectWithID: – objectRegisteredForID: 在 NSManagedObjectContext.h 中声明

于 2013-05-03T16:12:59.107 回答