跨上下文传递ManagedObject ID

时间:2012-03-15 18:25:30

标签: ios core-data

情景:

我正在处理2个viewControllers,每个都有自己的上下文(相同的线程)。我正在尝试从MOC2传递managedObject的objectID - > MOC1,通过委托方法。很好,就是这样, 似乎 传递ObjectID。

这是问题......来自MOC1(委托)我通过[self.localMOC objectWithID:thePassedID]得到一个指向新对象的指针。我在找到的对象上运行一个NSLog,日志描述它,似乎找到了。现在,当我尝试在更新的获取结果控制器中找到它时,即使它在表视图中显示使用相同结果控制器的对象,也无法找到它。

以下是日志声明......
对象通过objectWithID:<Account: 0x6b11f90> (entity: Account; id: 0x6db44b0 <x-coredata:///Account/t5F84827D-E710-4331-A462-FCA1A0D335102> ; data: <fault>)

结果控制器对象:<Account: 0x6b1fc50> (entity: Account; id: 0x6b50250 <x-coredata://84B6642A-9C80-451F-BED4-52952EDFC43C/Account/p9> ; data: <fault>)

似乎一个是永久ID,另一个是临时ID,以及完全不同的内存地址。

关于我做错了什么的线索?

以下是流程:

enter image description here

4 个答案:

答案 0 :(得分:1)

每个托管对象上下文都应该注册为来自其他上下文的“did save”通知(NSManagedObjextContextDidSaveNotification)的观察者,以便它可以在使用mergeChangesFromContextDidSaveNotification: 保存时合并来自其他上下文的更改。 / p>

答案 1 :(得分:1)

认为 ObjectID的两种不同形式表明第一个(不在/p9结尾意味着它已被插入但尚未保存。你确定吗?在那一点上?你通常可以通过在.sqlite文件中检查你的核心数据所支持的来备份它(请注意这是实现细节)并使用sqlite3来select * from Z<nameOfCoreDataEntityHere> where z_pk = 9;

答案 2 :(得分:0)

重新设计后,我使用了iOS5的父/子MOC。我仍然不完全理解为什么对象ID,即使它们是永久ID,也在上下文之间返回不同的对象。它显然与它的合并有关,即使我在完全保存后重新获取数据。希望随着时间的推移,核心数据的内部工作将逐渐对我更有意义。谢谢你的建议。

答案 3 :(得分:0)

在从新对象获取objectID之前, 使用obtainPermanentIDsForObjects方法将其NSManagedObjectContext。 它会让你获得一个perm id而无需等到保存。