何时需要获取PermanentIDsForObjects:error:?来自2个不同的班级?

Posted

技术标签:

【中文标题】何时需要获取PermanentIDsForObjects:error:?来自2个不同的班级?【英文标题】:When Is obtainPermanentIDsForObjects:error: ever needed? from 2 different classes? 【发布时间】:2014-08-07 00:46:58 【问题描述】:

我对使用这种(2 个不同版本,返回值不同)方法的背景的理解是:由 MOC 在内存中创建的托管对象首先分配临时对象 ID,以便可以唯一标识它们而不涉及持久性店铺。但是,当保存 MOC 时,持久存储协调器需要这些托管对象的永久对象 ID。 (如果我错了,请纠正我!)

我没用过MOC的

- (BOOL)obtainPermanentIDsForObjects:(NSArray *)objects error:(NSError **)error

,但仍然调用 MOC 的 save: 方法没有问题。但是我本周由第 3 方使用的代码,每次插入新的托管对象后都使用此 MOC 的获取永久 IDsForObjects,这真的有必要吗?多线程环境可能需要?但是为什么苹果“CoreData PG”从来没有提到过这种方法呢?在保存 MOC 之前,persistent-store-coordinator 是否自动为我完成了这项工作?

在研究过程中,我在 NSIncrementalStore 类中看到了此方法的另一个版本...

- (NSArray *)obtainPermanentIDsForObjects:(NSArray *)array error:(NSError **)error

,它说“这个方法在 executeRequest:withContext:error: 之前被调用(在子类中被覆盖然后调用,我猜),带有保存请求,为新插入的对象分配永久 ID。”

我该怎么办?我是否需要同时使用这两个版本(保存前的 NSIncrementalStore 子类和新创建后的 MOC 版本)?哪个方法必须调用 OR 都不调用?

谢谢!

【问题讨论】:

【参考方案1】:

NSManagedObject 首次插入NSManagedObjectContext 时,它有一个临时NSManagedObjectID。保存上下文时,NSManagedObjectContext 将在 NSManagedObjectContext 上执行 obtainPermanentIDsForObjects:error 的等效操作,后者又调用 NSPersistentStoreCoordinator,它找到负责此对象的存储并在存储本身上调用 obtainPermanentIDsForObjects:error。这会将NSManagedObject 的临时 ID 变为永久 ID。

NSManagedObjectIDs 可以在 NSManagedObjectContexts 之间传递(如果它们共享相同的存储),但前提是 NSManagedObjectID 是永久 ID。您可以调用obtainPermanentIDsForObjects:error 将临时ID 转换为独立于保存操作的永久ID,但对象所属的商店可能不会这样。

【讨论】:

谢谢@quellish!因此,为了在 MOC 之间传递 NSManagedObjectID,我最好调用这个方法,而不依赖于任何 MOC 的保存操作 最好保存而不是直接调用这个方法。创建一个新的子上下文,设置父级,插入您的对象并保存在子级中。该对象将被推送到父级,不再进一步。如果你愿意,可以丢弃孩子。 是否有适合调用此方法的情况? 并非如此。最好保存而不是直接调用此方法。您始终可以创建一个一次性上下文来执行此操作。 你 @quellish,是我在 *** 的最爱。阅读您的答案比 Apple 文档更有帮助!你有网站吗?

以上是关于何时需要获取PermanentIDsForObjects:error:?来自2个不同的班级?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 何时何地为视图控制器获取服务器数据

何时使用 MySQLdb 关闭游标

无法在处理程序中获取数据何时(已解决:)

获取唯一编号并知道它们何时被释放

外盘持仓盈亏何时推送---ITapTradeAPINotify::OnRtnPositionProfit

多线程注意事项和获取子线程何时都执行完毕