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

Ios5 existingObjectWithID:error:返回nil,但objectWithID:返回实际可用的对象,ios5,core-data,nsmanagedobjectcontext,Ios5,Core Data,Nsmanagedobjectcontext,我从文档和中了解到,如果数据存在,NSManagedObjectContext的existingObjectWithID:error:和objectWithID:方法应该返回相同的对象,但当数据不存在时,existingObjectWithID:error:将返回nil,而objectWithID:将返回具有错误而不是数据的对象 我在应用程序中看到的是一个实例,其中(在子托管对象上下文中的后台线程上创建对象并保存后,然后转到主线程,保存并将对象ID从子上下文带到父对象上下文),existingO

我从文档和中了解到,如果数据存在,NSManagedObjectContext的
existingObjectWithID:error:
objectWithID:
方法应该返回相同的对象,但当数据不存在时,
existingObjectWithID:error:
将返回
nil
,而
objectWithID:
将返回具有错误而不是数据的对象

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

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

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



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

问题可能出现在临时对象ID中。对象ID在保存到存储区之前不是永久性的。因此,问题是何时从子上下文中的托管对象获取对象ID:在保存父对象之前还是之后


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

当子上下文保存并发布
NSManagedObjectContextDidSaveNotification
通知时,您是否正在执行
mergeChangesFromContextDidSaveNotification:
合并更改?@dtrotzjr:是的。您可以显示您的代码吗?有太多的事情你可以做错。在看不到实际代码的情况下,这是一个猜测游戏。一种可能性是您正在使用performBlock:进行保存,并且在执行performBlock:之前在父上下文中使用对象id。你的“试一试”想法很糟糕。不要尝试。解决根本问题,而不是使用try-catch修复症状。当您从现有objectwithid:error:获得nil时,错误参数的值是多少?