我对使用它的背景(2个不同的版本,它们在返回值上有所不同)的理解是:管理 - 由MOC在内存中创建的对象首先被分配临时对象ID,以便可以唯一地识别它们而不涉及持久性商店。但是,在保存MOC时,持久性存储协调器需要这些Managed-objects的永久对象ID。 (请纠正我,如果我错了,请!)
我从未使用过MOC的
- (BOOL)obtainPermanentIDsForObjects:(NSArray *)objects error:(NSError **)error
,但仍然可以毫无问题地调用MOC的save:方法。但是我本周第三方使用的代码,每次插入一个新的Managed-object后都使用这个MOC的getsPermanentIDsForObjects,这真的是必要的吗?可能需要多线程环境?但为什么Apple" CoreData PG"从未提过这种方法?持久存储协调器是否在保存MOC之前自动为我完成了?
在研究期间,我在NSIncrementalStore Class中看到了这个方法的另一个版本......
- (NSArray *)obtainPermanentIDsForObjects:(NSArray *)array error:(NSError **)error
,它说"在executeRequest之前调用此方法(在子类中重写,然后调用,我猜):withContext:error:带有保存请求,为新插入的对象分配永久ID。"
我该怎么办?我是否需要同时使用这两个版本(保存前的NSIncrementalStore子类和新创建后的MOC' s)?哪种方法必须叫做OR?
谢谢!
答案 0 :(得分:3)
当NSManagedObject
首次插入NSManagedObjectContext
时,它会有一个临时NSManagedObjectID
。保存上下文后,NSManagedObjectContext
将在obtainPermanentIDsForObjects:error
上执行相当于NSManagedObjectContext
的操作,NSPersistentStoreCoordinator
会调用obtainPermanentIDsForObjects:error
,后者会查找负责此对象的商店并调用{ {1}}在商店本身。这会将NSManagedObject
的临时ID转换为永久ID。
NSManagedObjectID
可以在NSManagedObjectContext
之间传递(如果它们共享相同的商店),但前提是NSManagedObjectID
是永久ID。您可以调用obtainPermanentIDsForObjects:error
将临时ID转换为独立于保存操作的永久ID,但该对象所属的商店可能并不期望这样。