保存后 ManagedObject 的上下文为零

Posted

技术标签:

【中文标题】保存后 ManagedObject 的上下文为零【英文标题】:ManagedObject has nil context after save 【发布时间】:2013-05-03 16:08:32 【问题描述】:

这是在后台线程上。它是一个私有并发类型上下文,它在上下文 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?

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

谢谢

【问题讨论】:

【参考方案1】:

改用现有的ObjectWithID。

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

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

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

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

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

可用性 适用于 OS X v10.6 及更高版本。也可以看看 - objectWithID: – objectRegisteredForID: 声明于 NSManagedObjectContext.h

【讨论】:

如果你忽略了我所说的关于关系的部分并且只是阅读上面的代码,那么我所做的就是加载一个对象,保存上下文,然后它的上下文为零。此示例代码中没有任何关系。 您是从 ID 加载它吗?你从哪里弄来的那个ID?尝试先获取对象然后保存它。 id 可能会发生变化。 很酷!...现在我需要找出原因。 objectWithID 没有抛出异常。他们都返回一个对象。 FFXCollection 在主上下文中的主线程上加载,它将它的 objectID 传递给新创建的后台上下文,以将来自网络的数据加载到其中。数据加载完成后,它们与 FFXCollection 关联,然后返回主线程进行刷新。 感谢您的文档,但是我已经阅读了这篇文章,但并没有更清楚。两种方法都返回对象,但是在立即保存背景上下文后,使用 objectWithID 会破坏对象与上下文的关系。而 existingObjectWithID 没有。我需要知道这背后的根本原因。我错过了什么明显的东西吗? 保存后是否从上下文中删除了故障对象?

以上是关于保存后 ManagedObject 的上下文为零的主要内容,如果未能解决你的问题,请参考以下文章

通过 RestKit 发布 ManagedObject 会导致“无法更新从未插入的对象”

iPad --- [self.tableViewSection reloadData] 时的 managedObject 问题

将 ManagedObject 转换为 NSObject

检查 Core Data managedObject 中的多个 nil 值?

使用Core Data将文本从文本字段分配到托管对象上下文

如何将 ManagedObjectID 传递给主线程