保存后 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 问题