我对使用此方法的背景(两个不同版本的返回值不同)的理解是: MOC在内存中创建的托管对象首先被分配临时对象ID,这样就可以在不涉及持久存储的情况下唯一标识它们。但是,保存MOC时,持久性存储协调器需要这些托管对象的永久对象ID。(如果我弄错了,请纠正我!)
我从没用过MOC
- (BOOL)obtainPermanentIDsForObjects:(NSArray *)objects error:(NSError **)error,但仍然调用MOC的保存:方法没有问题。然而,我本周由第三方使用的代码,每次插入新的托管对象之后都使用这个MOC的obtainPermanentIDsForObjects,这真的有必要吗??可能是多线程环境所需要的?但是为什么苹果"CoreData PG“从来没有提到过这种方法呢?在保存MOC之前,持久性存储协调器是否会自动为我完成此操作?
在研究期间,我在NSIncrementalStore类中看到了该方法的另一个版本。
- (NSArray *)obtainPermanentIDsForObjects:(NSArray *)array error:(NSError **)error它说:“在executeRequest:withContext:error: with请求之前调用此方法(在子类中重写,然后调用),以便为新插入的对象分配永久ID。”
我该怎么办?我是否需要使用这两个版本(NSIncrementalStore子类的在保存之前,以及MOC的版本在新的创建之后)?哪种方法必须调用或不调用?
谢谢!
发布于 2014-08-07 01:15:17
当NSManagedObject第一次插入到NSManagedObjectContext中时,它有一个临时NSManagedObjectID。当保存上下文时,NSManagedObjectContext将执行与NSManagedObjectContext上的obtainPermanentIDsForObjects:error等价的操作,后者反过来调用NSPersistentStoreCoordinator,后者查找负责此对象的存储,并在存储本身上调用obtainPermanentIDsForObjects:error。这将NSManagedObject的临时ID转换为永久ID。
NSManagedObjectIDs可以在NSManagedObjectContext之间传递(如果它们共享相同的存储区),但只有当NSManagedObjectID是永久ID时才能传递。您可以调用obtainPermanentIDsForObjects:error将临时ID转换为独立于保存操作的永久ID,但是对象所属的存储可能并不期望这样做。
https://stackoverflow.com/questions/25172559
复制相似问题