我从文档和this answer的理解是,如果数据存在,NSManagedObjectContext的existingObjectWithID:error:
和objectWithID:
方法应该返回相同的对象,但是当数据不存在时, existingObjectWithID:error:
将返回nil
,而objectWithID:
将返回包含错误而非数据的对象。
我在应用程序中看到的是一个实例,其中(在子管理对象上下文中的后台线程上创建对象并保存,然后转到主线程,保存并从子项中引入对象ID)父对象上下文的上下文),existingObjectWithID:error:
返回nil
,但objectWithID:
返回一个包含有效数据的实际可用对象,而不是错误。
我对这两种方法的理解是否不正确?我做错了吗?
(我想要返回 - nil
- 当existingObjectWithID:error:
没有数据行为时,但是无法获取新创建的对象的数据是有问题的。)
编辑 :我想我可以使用objectWithID:
,然后立即测试访问try-catch块中返回对象的属性,捕获抛出异常,并用nil
(as is done here)替换伪造的对象,但在Objective-C中try-catch是昂贵的,这似乎是一个非常糟糕的主意。
答案 0 :(得分:1)
问题可能出在临时对象ID中。在将对象ID保存到商店之前,它不是永久性的。所以问题是你何时从子上下文中的托管对象获取对象ID:在保存父项之前或之后。
如果在保存父级之前执行此操作(反过来,如果父级配置了持久性存储协调器而不是另一个父级,则导致保存到存储),那么您可能会获得临时对象ID。由于某些原因,Apple没有向我们透露从对象ID返回托管对象的方法之一,但另一方法没有。