existingObjectWithID:error:返回nil,但objectWithID:返回实际可用对象

时间:2012-09-19 22:02:05

标签: ios5 core-data nsmanagedobjectcontext

我从文档和this answer的理解是,如果数据存在,NSManagedObjectContext的existingObjectWithID:error:objectWithID:方法应该返回相同的对象,但是当数据不存在时, existingObjectWithID:error:将返回nil,而objectWithID:将返回包含错误而非数据的对象。

我在应用程序中看到的是一个实例,其中(在子管理对象上下文中的后台线程上创建对象并保存,然后转到主线程,保存并从子项中引入对象ID)父对象上下文的上下文),existingObjectWithID:error:返回nil,但objectWithID:返回一个包含有效数据的实际可用对象,而不是错误。

我对这两种方法的理解是否不正确?我做错了吗?

(我想要返回 - nil - 当existingObjectWithID:error:没有数据行为时,但是无法获取新创建的对象的数据是有问题的。)


编辑 :我想我可以使用objectWithID:,然后立即测试访问try-catch块中返回对象的属性,捕获抛出异常,并用nilas is done here)替换伪造的对象,但在Objective-C中try-catch是昂贵的,这似乎是一个非常糟糕的主意。

1 个答案:

答案 0 :(得分:1)

问题可能出在临时对象ID中。在将对象ID保存到商店之前,它不是永久性的。所以问题是你何时从子上下文中的托管对象获取对象ID:在保存父项之前或之后。

如果在保存父级之前执行此操作(反过来,如果父级配置了持久性存储协调器而不是另一个父级,则导致保存到存储),那么您可能会获得临时对象ID。由于某些原因,Apple没有向我们透露从对象ID返回托管对象的方法之一,但另一方法没有。