为啥我们在 NSManagedObject 中需要临时 ID

Posted

技术标签:

【中文标题】为啥我们在 NSManagedObject 中需要临时 ID【英文标题】:Why do we need temporary ID in NSManagedObject为什么我们在 NSManagedObject 中需要临时 ID 【发布时间】:2012-11-16 08:51:00 【问题描述】:

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

很好。

然后我读到这个: 获得PermanentIDsForObjects:错误:

将给定数组中对象的对象 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>"
)

我们可以通过在对象被保存之前调用getPermanentIDsForObjects来给对象永久ID。

那么,为什么 ios 还要等到保存才能提供永久 ID?为什么不马上呢?

【问题讨论】:

【参考方案1】:

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

【讨论】:

足够好了。我还是不明白为什么保存数据不会改变我的 managedObjects 的 ID。 我找到了原因。将数据保存到父级后,我应该让父级也存储数据。

以上是关于为啥我们在 NSManagedObject 中需要临时 ID的主要内容,如果未能解决你的问题,请参考以下文章

为啥会有一个子类 NSManagedObject?

为啥我的 ivar 没有在 NSManagedObject 子类上设置

为啥自动创建的 NSManagedObject 子类没有“正确”标题?

核心数据-后台线程中的更新实体会自动更改主线程中的 NSManagedObject 而无需合并-为啥?

为啥 insertNewObjectForEntityForName 只返回一个 NSManagedObject?

为啥我使用 NSManagedObject 在 self 上获得基于块的崩溃清除 KVO?