0

一个简单的猜测是因为当我们最近添加我们不知道或没有特定信息来创建永久 ID 的对象时。

美好的。

然后我读到这个:obtainPermanentIDsForObjects:error:

将给定数组中对象的对象 ID 转换为永久 ID。- (BOOL)obtainPermanentIDsForObjects:(NSArray )objects 错误:(NSError * )error

该方法将objects中每个被管理对象的object ID转换为一个永久的ID。尽管该对象将具有一个永久 ID,但它仍会积极响应 isInserted直到它被保存。任何已经具有永久 ID 的对象都会被忽略。

任何尚未分配给存储的对象都基于 Core Data 在保存操作期间用于分配的相同规则进行分配(支持实体的第一个可写存储,并且适用于实例及其相关项)。特别注意事项

好的,所以我们在保存 NSManagedObject 之前获得了临时 ID。然而

保存 managedObjectContext 不会更新 NSManagedObjects 的 ID。它与此代码显示的相同:

PO([Catalogs convertEachElementToAnother:(id)^(id element) {
    BGCatalogData * data = (BGCatalogData*) element;
    NSManagedObjectID * theObjectID= data.objectID;
    return theObjectID;
}]);

NSError * error;
BOOL saveSuccesfully = [[BGMDCRManagedObjectContextThreadHandler managedObjectContext] save:&error];
PO([Catalogs convertEachElementToAnother:(id)^(id element){
    BGCatalogData * data = (BGCatalogData*) element;
    NSManagedObjectID * theObjectID= data.objectID;
    return theObjectID;
}]);'

mod注意:我无法将以上内容转换为代码

结果是:

[Catalogs convertEachElementToAnother:(id)^(id element){ BGCatalogData * data = (BGCatalogData*) element; NSManagedObjectID * theObjectID= data.objectID; return theObjectID; }]: (
    "0x888a340 <x-coredata:///BGCatalogData/t084E0F43-A129-4023-8190-2962D8D0930A603>",
    "0x888d670 <x-coredata:///BGCatalogData/t084E0F43-A129-4023-8190-2962D8D0930A609>",
    "0x888ed50 <x-coredata:///BGCatalogData/t084E0F43-A129-4023-8190-2962D8D0930A615>",
    "0x888f690 <x-coredata:///BGCatalogData/t084E0F43-A129-4023-8190-2962D8D0930A621>"
)
2012-11-16 15:33:28.489 BadgerNew[26871:1d03] [Catalogs convertEachElementToAnother:(id)^(id element){ BGCatalogData * data = (BGCatalogData*) element; NSManagedObjectID * theObjectID= data.objectID; return theObjectID; }]: (
    "0x888a340 <x-coredata:///BGCatalogData/t084E0F43-A129-4023-8190-2962D8D0930A603>",
    "0x888d670 <x-coredata:///BGCatalogData/t084E0F43-A129-4023-8190-2962D8D0930A609>",
    "0x888ed50 <x-coredata:///BGCatalogData/t084E0F43-A129-4023-8190-2962D8D0930A615>",
    "0x888f690 <x-coredata:///BGCatalogData/t084E0F43-A129-4023-8190-2962D8D0930A621>"
)

在保存对象之前,我们可以通过调用 gainPermanentIDsForObjects 为对象提供永久 ID 。

那么为什么IOS还要等到保存才能给出永久ID呢?为什么不马上呢?

4

1 回答 1

0

因为 CoreData 必须操纵底层持久存储来“阻止”其他对象的永久 ID(例如,增加一个计数器)。如果您在保存它之前不需要永久ID,这是一件不必要且可能很慢的事情(您可以仅临时使用您的物品并且永远不要保存它)

于 2012-11-16T09:13:47.067 回答